2017-04-13 163 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); 
相關問題