sql >> Base de Datos >  >> RDS >> Sqlserver

Incluir meses faltantes en la consulta Agrupar por

Esta solución no requiere que codifique la lista de meses que puede desear, todo lo que necesita hacer es proporcionar cualquier fecha de inicio y cualquier fecha de finalización, y calculará los límites de los meses por usted. Incluye el año en la salida para que admita más de 12 meses y para que sus fechas de inicio y finalización puedan cruzar un límite de año y aun así ordenar correctamente y mostrar el mes correcto y año.

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;