计算SQL Server中每个月的行数

时间:2018-06-22 09:47:59

标签: sql sql-server tsql

我正在使用SQL Server。我有一张下表Orders

Orders (Id, ItemId, CustomerId, Quantity, OrderDateTime)

我想计算每个月的订单数量。我已经写了以下查询中的2个。

查询1:

SELECT 
    MONTH(OrderDateTime) AS MonthCol, 
    YEAR(OrderDateTime) AS YearCol, 
    COUNT(id) AS OrderCount
FROM 
    Orders
WHERE 
    OrderDateTime >= '2000' AND OrderDateTime <= '2018'
GROUP BY 
    YEAR(OrderDateTime), MONTH(OrderDateTime)
ORDER BY 
    YearCol, MonthCol

查询2:

SELECT 
    DATEPART(mm, OrderDateTime) AS Month, 
    COUNT(*) AS OrderCount
FROM 
    Orders
WHERE
    OrderDateTime >= '2000' AND OrderDateTime <= '2018'
GROUP BY 
    DATEPART(mm, OrderDateTime)

两个查询的问题是我没有得到0个订单的列。我将如何获得?

2 个答案:

答案 0 :(得分:1)

SQL不会为您提供不作为行存在的月份和年份的数据。要获得0个订单行,您需要将结果与包含所有需要的月份和年份的日历表进行正确的连接,或者也可以使用计数表。

Select T.MonthCol, T.YearCol,OrderCount= COALESCE(OrderCount,0)
from
(
SELECT MONTH(OrderDateTime) AS MonthCol, YEAR(OrderDateTime) AS YearCol, count(id) AS OrderCount
FROM Orders
WHERE OrderDateTime >= '2000' AND OrderDateTime <= '2018'
GROUP BY YEAR(OrderDateTime), MONTH(OrderDateTime)
ORDER BY YearCol, MonthCol)
P
RIGHT JOIN
(
select * from 
( values (2000),(2001),(2002),(2003),(2004),(2005),(2006),(2007),(2008))v(YearCol)
cross join
( values (1),(2),(3),(4),(5),(6),(7),(8),(9),(10),(11),(12))u(MonthCol)
)T
on P.MonthCol=T.MonthCol
and P.YearCol=T.YearCol

答案 1 :(得分:0)

为此,我倾向于使用递归CTE-这样就可以轻松灵活地实现所需范围:

with dates as (
      select cast('2000-01-01' as date) dte
      union all
      select dateadd(month, 1, dte)
      from dates
      where dte < '2018-12-01'
     )
select year(OrderDateTime) AS year,
       month(OrderDateTime) AS month,
       count(o.id) as OrderCount
from dates left join
     orders o
     on d.OrderDateTime >= dates.dte and
        d.OrderDateTime < dateadd(month, 1, dates.dte)
group by year(OrderDateTime), month(OrderDateTime)
order by year(OrderDateTime), month(OrderDateTime)
option (maxrecursion 0);

注意:

  • 这使用JOIN进行过滤。这样可以更安全地更改您要查找的范围。
  • 我发现year()month()函数更加方便datepart()
  • 使用日期部分时,将其拼写清楚。为什么浪费脑力去想想mm真的意味着几个月还是几分钟?
  • 我添加了一个order by。大概您希望按时间顺序显示结果。