Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Inclure les mois manquants dans la requête Grouper par

Cette solution ne vous oblige pas à coder en dur la liste des mois que vous pourriez souhaiter, tout ce que vous avez à faire est de fournir une date de début et une date de fin, et elle calculera les limites des mois pour vous. Il inclut l'année dans la sortie afin qu'il prenne en charge plus de 12 mois et que vos dates de début et de fin puissent franchir une limite d'année et toujours s'ordonner correctement et afficher le bon mois et année.

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;