Je l'utiliserais :
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;
Ce groupe sera constitué le premier de chaque mois, alors
`DATEADD(MONTH, DATEDIFF(MONTH, 0, '20130128'), 0)`
donnera '20130101'
. Je préfère généralement cette méthode, car elle permet de conserver les dates en tant que 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 du résultat que vous souhaitez obtenir. (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, elle peut l'être).