假设你有订单
| 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
的数量?
答案 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);