web-dev-qa-db-fra.com

MySQL utilisant Sum et Case

J'essaie de créer un GridView avec ASP.NET se connectant à une base de données MySQL. Les données apparaissent comme ci-dessous.

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

Sur la base des enregistrements ci-dessus, j'aimerais que le résultat apparaisse comme ci-dessous

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

Mon code actuel est ci-dessous. Cela me donne une erreur (quelque chose à propos de DatabaseName.sum n'existe pas. Consultez la section Analyse et résolution des noms de fonctions ...)

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 

le code continue

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

Sum Case est-il la meilleure utilisation ici?

16
Latex Person

L'erreur est causée par l'espace entre le nom de la fonction et les parenthèses

SUM (CASE WHEN ...
   ^^

En savoir plus Analyse et résolution des noms de fonction

Essayer

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

Voici SQLFiddle démo

27
peterm