Giải pháp này không yêu cầu bạn mã hóa danh sách các tháng bạn có thể muốn, tất cả những gì bạn cần làm là cung cấp bất kỳ ngày bắt đầu và ngày kết thúc nào và nó sẽ tính toán ranh giới tháng cho bạn. Nó bao gồm năm trong đầu ra để nó sẽ hỗ trợ hơn 12 tháng và để ngày bắt đầu và ngày kết thúc của bạn có thể vượt qua ranh giới một năm mà vẫn có thứ tự chính xác và hiển thị đúng tháng và năm.
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;