Я б використав це:
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;
Це буде групуватися до першого числа кожного місяця, отже
`DATEADD(MONTH, DATEDIFF(MONTH, 0, '20130128'), 0)`
дасть '20130101'
. Я зазвичай віддаю перевагу цьому методу, оскільки він зберігає дати як дати.
В якості альтернативи ви можете використовувати щось на зразок цього:
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;
Це насправді залежить від бажаного результату. (Рік закриття не є необхідним у вашому прикладі, але якщо діапазон дат переходить межу року, це може бути).