2017-04-13 138 views
1

假设你有订单SQL Server:当没有订单时每月计算所有天数?

| 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

列日期的数据类型? – jarlh

+0

你的想法看起来不错 –

+0

27是一个错字?最后我查了一下,大多数一月份的时间都是31天,而我在1月份只记录了3天的订单。 –

回答

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

还有一种方法可以获取月结束日期的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是不允许的。

+0

谢谢,我测试了这个工作[这里](http://data.stackexchange.com/stackoverflow/query/657892/sql-ms-select-天的时候,没有订单和计数它们)。 – hhh

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); 
相关问题