2017-04-13 18 views
1

は、あなたが注文SQL Server:何も注文がない場合、月ごとのすべての日数を計算しますか?

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

と全く注文が、私はT-SQLでこれをやりたい

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

ない日があるとします。私の最初のアイデアは1年間のテーブルを作成して、1行につき1日中のすべての日を注文と結びつけることです。今、NULLの合計は、私たちに無注文の結果を与えます。

月額NoOrdersの数値は、SQL Server 2014の上記のようなトランザクションデータからどのように計算できますか?

+0

カラム日付のデータ型? – jarlh

+0

あなたの考えはよかったよ –

+0

27はtypoですか?最後に私がチェックしたところ、ほとんどの1月は31日間で、1月に3日間しか注文できません。 –

答えて

2

追加のテーブルは必要ありません。あなたが必要とするのは、1ヶ月の日数を計算する方法だけです。注意点としては

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を取得し、注文があったときの別の日付の数を減算するもう1つの方法。

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); 
関連する問題