2016-11-24 25 views
0

特定の日付から販売日をグループ化する必要があります。日付は、販売データがエクスポートされた日付によって決まります。以下の例では、データは2016/11/10にエクスポートされます。SQL:毎月の特定の日付から日付をグループ化する方法

次に、各期間の売上を計算するには、販売日を黄色の列にグループ化する必要があります。

私はdateadd関数を試しましたが、毎月の日が異なるため、動作しません。

ご意見をいただければ幸いです。ありがとう。

enter image description here

+0

データは常に10日にエクスポートされますか?そうでない場合は、エクスポートした日付をテーブルに記録しますか? –

+0

@ destination-data、いいえ、必ずしも10日ではありません。私は1ヶ月に数回それをするかもしれない。 –

+0

日付はどのように分かりますか?それはテーブルに記録されていますか?または、それは常に現在の日ですか(つまり、24日に輸出してから24日を使用する場合)?カレンダーテーブルを作成する場合は、ピリオドが定義されていれば –

答えて

1

この課題への鍵は、あなたがグループことができる何かを見つけることです。これはデータには存在しないため、作成する必要があります。私の基本的な考えは、日付をオフセットすることです。現在の日の後に落ちる日は、翌月にプッシュされます。これは、私たちがグループ化できる報告月を与えてくれます。

私のクエリは、次のサンプルデータを使用しています:

-- Generates a sample table. 
-- Contains one record per day, between Dec 1st 2015 and Feb 29th 2016. 
DECLARE @BaseDate DATE = '2015-12-01'; 
DECLARE @Sample TABLE 
    (
     DateKey DATE 
    ) 
; 

WHILE @BaseDate < '2016-02-29' 
BEGIN 

    INSERT INTO @Sample 
     (
      DateKey 
     ) 
    VALUES 
     (@BaseDate) 
    ; 

    SET @BaseDate = DATEADD(DAY, 1, @BaseDate); 
END 

をそして、ここにある:

DateKey  ReportingMonth 
2016-02-28 2016-03-01 
2016-02-28 2016-03-01 
2016-02-27 2016-03-01 
2016-02-26 2016-03-01 
2016-02-25 2016-03-01 
2016-02-24 2016-02-01 -- Reporting period changes here. 
2016-02-23 2016-02-01 
2016-02-22 2016-02-01 
... 
2015-12-03 2015-12-01 
2015-12-02 2015-12-01 
2015-12-01 2015-12-01 

-- Offsets the date into reporting month groups. 
SELECT 
    DateKey, 
    CASE   
     WHEN DAY(DateKey) > DAY(GETDATE())THEN 
      CASE MONTH(DateKey) WHEN 12 THEN DATEFROMPARTS(YEAR(DateKey) + 1, 1, 1) 
      ELSE DATEFROMPARTS(YEAR(DateKey), MONTH(DateKey) + 1, 1) 
     END    
     ELSE DATEFROMPARTS(YEAR(DateKey), MONTH(DateKey), 1) 
    END AS ReportingMonth 
FROM  
    @Sample 
WHERE 
    DateKey BETWEEN '2015-12-01' AND '2016-04-30' 
ORDER BY 
    DateKey DESC 
; 

あなたは結果がどのように見える月の24日にこれを実行した場合

正直言って、私はこのクエリに満足できません。私はそれが改善され、単純化できると確信しています。しかし、うまくいけば、それはあなたに良い出発点を提供します。

+0

、多くのおかげで、それは私の問題を解決しました。 –

関連する問題