2017-07-14 127 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 

我需要的是由許多獨特的客戶如何購買了該項目當天和項目分組彙總當天的周(即日+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 

我真的很難與如何採取每一個不同的項目+日組合,並獲得當天(一天中的任何一方3天)當週的獨特客戶,並加入這些結果。

我一直在玩一些循環和CTE,但我似乎沒有任何值在任何給定的領域是唯一的問題。我確信有一個簡單的方法來做到這一點,我只是沒有想到?

+0

窗口函數 –

+0

2個子查詢和連接。你應該有(或創建)一個表來幫助確定同一周的日期。 – DVT

+0

我剛看了一下窗口函數@JoePhillips。描述聽起來很有希望,但似乎在OVER子句中不允許使用DISTINCT?我使用over條款來查看買家的日期,但我只需要統計不同的客戶,而且客戶可以每週/每週多次購買。 – 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 

或者...... 您尋找的每個個人從他們的購買+/- 3天,這可能是一個連續滾動的時間段,如果一個人進來,購買每2-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

我會嘗試這樣的事情。

相關問題