2013-10-22 23 views
7

Bir MySQL veritabanına bağlanan ASP.NET ile bir GridView oluşturmaya çalışıyorum. Veriler aşağıdaki gibi görünür.MySQL Sum ve Case kullanarak

BusinessUnit OrderDate  Canceled 
UnitA   1/15/2013   N 
UnitA   10/1/2013   N 
UnitB   10/15/2013   N 
UnitB   10/22/2013   N 
UnitB   10/22/2013   N 

yukarıdaki kayıtlara dayanarak, sonuç Benim şu anki kod aşağıda

BusinessUnit TodaysOrders ThisMonthsOrders ThisYearsOrders 
UnitA    0    1    2 
UnitB    2    3    3 

altında gibi görünmesini istediğiniz. Bana hatayı veriyor (DatabaseName.sum ilgili bir şey yok. Fonksiyon Adı Çözümlenmesi ve İlke Kararı'nın' bölümünü kontrol ...) kodu

FROM OrderTable WHERE OrderTable.Canceled. <> 'Y'; 

devam

Select 
    SUM (CASE WHEN (OrderDate)=DATE(NOW()) THEN 1 ELSE 0 END) AS TodaysOrders, 
    SUM (CASE WHEN YEAR(OrderDate) = YEAR(CURDATE()) AND MONTH(OrderDate) = MONTH(CURDATE()) THEN 1 ELSE 0 END) AS ThisMonthsOrders, 
    SUM (CASE WHEN YEAR(main_order_managers.creation_date) = YEAR(CURDATE()) THEN 1 ELSE 0 END) AS ThisYearsOrders 

Sum Vaka iyi kullanım mı İşte?

+0

Kişisel bağlamdır deneyin toplamı (durum) amaçlandığı kadar iyi, ama Peterm'in aralıktaki cevabı meseleniz olabilir ... (Ancak, İptal edildikten sonraki süreyi kaldırın. önce <> 'Y') – DRapp

cevap

12

hata

SUM (CASE WHEN ... 
    ^^ 

Oku fonksiyon adı ve parantez arasındaki boşlukta kaynaklanır Function Name Parsing and Resolution

daha Burada

SELECT BusinessUnit, 
     SUM(CASE WHEN OrderDate = CURDATE() THEN 1 ELSE 0 END) TodaysOrders, 
     SUM(CASE WHEN DATE_FORMAT(OrderDate, '%Y%m') = DATE_FORMAT(CURDATE(), '%Y%m') THEN 1 ELSE 0 END) ThisMonthsOrders, 
     SUM(CASE WHEN YEAR(OrderDate) = YEAR(CURDATE()) THEN 1 ELSE 0 END) ThisYearsOrders 
    FROM OrderTable 
WHERE Canceled <> 'Y' 
GROUP BY BusinessUnit 

ait SQLFiddle demo