Deze oplossing vereist niet dat u de lijst met maanden die u misschien wilt hard codeert, u hoeft alleen een startdatum en een eventuele einddatum op te geven, en het berekent de maandgrenzen voor u. Het bevat het jaar in de uitvoer zodat het meer dan 12 maanden ondersteunt en zodat uw begin- en einddatum een jaargrens kunnen overschrijden en toch correct kunnen worden geordend en de juiste maand en kan worden weergegeven. jaar.
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;