2013-10-22 17 views
7

Sto provando a creare un GridView con ASP.NET che si connette a un database MySQL. I dati appaiono come di seguito.MySQL utilizzando Sum e Case

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 

Sulla base dei dati di cui sopra, mi piacerebbe il risultato di apparire come qui di seguito

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

mio codice attuale è al di sotto. E mi sta dando errore (qualcosa su DatabaseName.sum non esiste. Controllare il Nome della funzione di analisi e sezione Risoluzione' ...)

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 

codice continua

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

è la somma di caso il miglior uso Qui?

+0

tuo contesto sum (caso) va bene come previsto, ma per risposta di Peterm su spaziatura potrebbe essere il tuo problema ... (tuttavia, rimuovere il periodo dopo Annulla. prima di <> 'Y') – DRapp

risposta

12

L'errore è causato dallo spazio tra nome della funzione e la parentesi

SUM (CASE WHEN ... 
    ^^ 

Leggi tutto Function Name Parsing and Resolution

Prova

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 

Ecco SQLFiddle demo