在分组依据查询中包含缺失的月份

2023-12-19

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

我试图按月获取订单数,即使为零。这是问题查询:

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)

我想要得到的是这样的:

Month            Orders
-----            ------
January          10
February         7
March            0
April            12
May              0
June             5

...但是我的查询跳过了三月和五月的一行。我试过了COALESCE(COUNT(OrderNumber), 0) and ISNULL(COUNT(OrderNumber), 0)但我很确定分组导致它不起作用。


此解决方案不需要您硬编码您可能想要的月份列表,您所需要做的就是提供任何开始日期和任何结束日期,它会为您计算月份边界。它在输出中包含年份,以便支持超过 12 个月,这样您的开始日期和结束日期就可以跨越年份边界,并且仍然正确排序并显示正确的月份and year.

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;
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在分组依据查询中包含缺失的月份 的相关文章

随机推荐