2017-07-14 8 views
0

で毎週注文データを要約:私は必要なものは、私は次のようなデータを含むテーブルを持って一日のSQL Serverの

Item  Date  Customer 
------------------------------ 
apple 01/01/2017  a 
apple 01/01/2017  a 
apple 02/01/2017  b 
apple 05/01/2017  c 
apple 06/01/2017  b 
apple 06/01/2017  d 
apple 07/01/2017  c 
apple 09/01/2017  a 
banana 01/01/2017  b 
banana 02/01/2017  a 

は、顧客がでその項目を買ったどのように多くのUNIQUEの日と項目ごとにグループ化されまとめたものですその日の週(すなわち、日+ 3日)だけでなく、その日にも。

それは次のようになります。

Item   Date  Weekly Customers Daily Customers 
----------------------------------------------------------- 
    apple 01/01/2017   2    1 
    apple 02/01/2017   3    1 
    apple 05/01/2017   3    1 
    apple 06/01/2017   4    2 
    apple 07/01/2017   4    1 
    apple 09/01/2017   4    1 
    banana 01/01/2017   2    1 
    banana 02/01/2017   2    1 

を、私は私が正しいと思い以下でアイテム、日、独自のデイリーお客様によりまとめることができた:

SELECT 
    item as 'Item', boughtDate as 'Date', 
    COUNT(DISTINCT(customer)) as 'Daily Customers' 
FROM tbl1 
GROUP BY Item, Date 

私は実際にはそれぞれの別のアイテム+ 1日のコンボを取得し、その日のその日の週の合計のユニークな顧客を取得して(その日のいずれかの日に3日間)、これらの結果と結合する方法が本当に困っています。

私はいくつかのループとCTEで遊んできましたが、どのフィールドでも値が一意ではないという問題があるようです。私は思っていない、これを行う簡単な方法があると確信していますか?

+0

ウィンドウ関数 –

+0

2つのサブクエリと結合。あなたは、同じ週にある日付を判断するのに役立つテーブルを用意する(または作成する)必要があります。 – DVT

+0

私はちょうどウィンドウ関数@JoePhillipsを見てきました。説明は有望でしたが、DISTINCTの使用はOVER句で許可されていないようですか?私は購入日を見るためにover節を使用していましたが、私は別個の顧客を数える必要があり、顧客は1日/週に複数回購入することができます。 – learnerDev

答えて

0

あなたのクエリのパラメータ設定以外にも、これはあなたのニーズに適していますか?

結果を表す文字列に日付を変更しますか?この例では文字列が固定されているので、max()を適用するとgroup by節の一部としてその文字列を必要としません。

SELECT 
     item as 'Item', 
     max('Week of 7-11 to 7-17') as 'Date', 
     COUNT(DISTINCT(customer)) as 'Weekly Customers' 
    FROM 
     tbl1 
    where 
      boughtDate >= '2017-07-11' 
     and boughtDate < '2017-07-18' 
    GROUP BY 
     Item 

OR ... あなたは、人が2〜3日ごとに来て、買えば連続圧延の時間することができ+/- 3日彼らの購入から、個々の人を探していました。

+0

私は、実際のデータには数ヶ月のより長い期間が含まれていると言わざるを得ないので、クエリ自体に毎週の期間を指定したくありません。むしろ、SQLはテーブル内のそれぞれの別個の日付を調べ、その日付からすべての顧客レコードを選択してから+ 3日間、別個の顧客を数え、その合計をテーブルにその日付とアイテムに対して返すべきです。 – learnerDev

0

SELECT item as 'Item', max('Week of 7-11 to 7-17') as 'Date', COUNT(DISTINCT(customer)) as 'Weekly Customers' FROM tbl1 where boughtDate >= '2017-07-11' and boughtDate < '2017-07-18' GROUP BY Item

私はこのような何かをしようとするだろう。

関連する問題