在Group By查询中包含缺少的月份

Mic*_*son 11 t-sql sql-server group-by date-range

我想我在这里有一个艰难的...... :(

我想按月计算订单数量,即使是零.这是问题查询:

SELECT datename(month, OrderDate) as Month, COUNT(OrderNumber) AS Orders
FROM OrderTable
WHERE OrderDate >= '2012-01-01' and OrderDate <= '2012-06-30'
GROUP BY year(OrderDate), month(OrderDate), datename(month, OrderDate)
Run Code Online (Sandbox Code Playgroud)

我想要得到的是这样的:

Month            Orders
-----            ------
January          10
February         7
March            0
April            12
May              0
June             5
Run Code Online (Sandbox Code Playgroud)

...但我的查询在3月和5月跳过一行.我已经尝试了COALESCE(COUNT(OrderNumber), 0),ISNULL(COUNT(OrderNumber), 0)但我很确定分组导致无法正常工作.

Aar*_*and 24

此解决方案不要求您对可能需要的月份列表进行硬编码,您只需提供任何开始日期和结束日期,它将为您计算月份边界.它包括输出中的年份,因此它将支持超过12个月,因此您的开始和结束日期可以跨越一年边界并仍然正确排序并显示正确的月份年份.

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;
Run Code Online (Sandbox Code Playgroud)