Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Fehlende Monate in die Gruppieren nach-Abfrage einbeziehen

Diese Lösung erfordert nicht, dass Sie die Liste der gewünschten Monate fest codieren, Sie müssen lediglich ein beliebiges Startdatum und ein beliebiges Enddatum angeben, und die Monatsgrenzen werden für Sie berechnet. Es schließt das Jahr in die Ausgabe ein, damit es mehr als 12 Monate unterstützt und damit Ihre Start- und Enddaten eine Jahresgrenze überschreiten können und trotzdem die richtige Reihenfolge haben und den richtigen Monat und anzeigen Jahr.

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;