To rozwiązanie nie wymaga zakodowania listy miesięcy, które możesz chcieć, wystarczy podać dowolną datę rozpoczęcia i dowolną datę zakończenia, a obliczy za Ciebie granice miesięcy. Uwzględnia rok w danych wyjściowych, dzięki czemu będzie obsługiwał więcej niż 12 miesięcy, a daty rozpoczęcia i zakończenia mogą przekraczać granicę roku i nadal poprawnie porządkować i wyświetlać prawidłowy miesiąc i rok.
DECLARE @StartDate SMALLDATETIME, @EndDate SMALLDATETIME;
SELECT @StartDate = '20120101', @EndDate = '20120630';
;WITH d(d) AS
(
SELECT DATEADD(MONTH, n, DATEADD(MONTH, DATEDIFF(MONTH, 0, @StartDate), 0))
FROM ( SELECT TOP (DATEDIFF(MONTH, @StartDate, @EndDate) + 1)
n = ROW_NUMBER() OVER (ORDER BY [object_id]) - 1
FROM sys.all_objects ORDER BY [object_id] ) AS n
)
SELECT
[Month] = DATENAME(MONTH, d.d),
[Year] = YEAR(d.d),
OrderCount = COUNT(o.OrderNumber)
FROM d LEFT OUTER JOIN dbo.OrderTable AS o
ON o.OrderDate >= d.d
AND o.OrderDate < DATEADD(MONTH, 1, d.d)
GROUP BY d.d
ORDER BY d.d;