J'utiliserais ceci :
SELECT Closing_Date = DATEADD(MONTH, DATEDIFF(MONTH, 0, Closing_Date), 0),
Category,
COUNT(Status) TotalCount
FROM MyTable
WHERE Closing_Date >= '2012-02-01'
AND Closing_Date <= '2012-12-31'
AND Defect_Status1 IS NOT NULL
GROUP BY DATEADD(MONTH, DATEDIFF(MONTH, 0, Closing_Date), 0), Category;
Cela se groupera par le premier de chaque mois, donc
`DATEADD(MONTH, DATEDIFF(MONTH, 0, '20130128'), 0)`
donnera '20130101'
. Je préfère généralement cette méthode car elle conserve les dates comme des dates.
Vous pouvez également utiliser quelque chose comme ceci :
SELECT Closing_Year = DATEPART(YEAR, Closing_Date),
Closing_Month = DATEPART(MONTH, Closing_Date),
Category,
COUNT(Status) TotalCount
FROM MyTable
WHERE Closing_Date >= '2012-02-01'
AND Closing_Date <= '2012-12-31'
AND Defect_Status1 IS NOT NULL
GROUP BY DATEPART(YEAR, Closing_Date), DATEPART(MONTH, Closing_Date), Category;
Cela dépend vraiment de la sortie souhaitée. (L'année de clôture n'est pas nécessaire dans votre exemple, mais si la plage de dates traverse une limite d'année, cela peut l'être).