SQL Server:计算没有订单时每月的所有天数?

时间:2017-04-13 11:38:28

标签: sql sql-server sql-server-2014

假设你有订单

   | Order |     Date    | 
   -----------------------
   |   1   |   20150101  |
   |   2   |   20150103  |
   |   3   |   20150105  |
   |   11  |   20150211  |
   |   22  |   20150224  |
   |   33  |   20150204  |

以及没有订单的日子

   |  Month  | NoOrdersCount |
   ---------------------------   
   | 201501  |      28       |
   | 201502  |      25       |

我想在T-SQL中执行此操作。我的第一个想法是创建一年的表格,其中每行和左边的所有日期与订单一起加入。现在,NULL的总和给出了无订单的结果。

如何根据SQL Server 2014中的上述事务数据计算每月NoOrders的数量?

3 个答案:

答案 0 :(得分:2)

您不需要额外的桌子。您只需要一种计算一个月天数的方法。这是一种方法:

select year(date), month(date),
       (datediff(day,
                 dateadd(day, 1 - day(min(date)), min(date),
                 eomonth(date) + 1 -
        count(distinct date)
       ) as NoOrdersCount
from dates
group by year(date), month(date);

作为备注:如果您知道在非29日,30日或31日的月份中总有一天,您可以使用:

select year(date), month(date),
       (datediff(day, min(date), dateadd(month, 1, min(date))) -
        count(distinct date)
       ) as NoOrdersCount
from dates
group by year(date), month(date);

答案 1 :(得分:1)

另一种获取月结束日期day并减去订单时不同日期数量的方法。

select distinct year(date),month(date),
day(eomonth(date)) - (select count(distinct date) from orders o2
                      where year(o2.date)=year(o1.date) 
                      and month(o2.date)=month(o1.date))
from orders o1

可以使用窗口函数进行计数,但不允许distinct

答案 2 :(得分:0)

看起来这应该为你做。

select convert(char(6), date, 112) as Month,
       day(eomonth(min(date))) - count(distinct date) as NoOrdersCount
from dates
group by convert(char(6), date, 112);