2016-08-17 42 views
1

我有一個表(稱爲「交易」),其中包含客戶交易數據。每行包含一個客戶號碼和交易日期。我需要顯示每個客戶在規定的2周內完成的交易總數。對於所有的客戶,2周的時間從22/8/2016開始。所以我需要知道每個客戶在從22/8/2106起的兩個星期內進行了多少次交易。分爲兩週期間

我需要返回來顯示客戶編號,每個2週期間的開始日期以及該2週期間內的交易數量。

作爲一個例子,下面的示例數據:

 
╔══════════╦════════════╗ 
║ Customer ║ Date  ║ 
╠══════════╬════════════╣ 
║ 1234  ║ 22/08/2016 ║ 
╠══════════╬════════════╣ 
║ 1234  ║ 23/08/2016 ║ 
╠══════════╬════════════╣ 
║ 1234  ║ 24/08/2016 ║ 
╠══════════╬════════════╣ 
║ 1234  ║ 3/09/2016 ║ 
╠══════════╬════════════╣ 
║ 1234  ║ 3/09/2016 ║ 
╠══════════╬════════════╣ 
║ 5678  ║ 26/08/2016 ║ 
╠══════════╬════════════╣ 
║ 5678  ║ 27/08/2016 ║ 
╠══════════╬════════════╣ 
║ 5678  ║ 28/08/2016 ║ 
╠══════════╬════════════╣ 
║ 5678  ║ 29/08/2016 ║ 
╠══════════╬════════════╣ 
║ 5678  ║ 30/08/2016 ║ 
╠══════════╬════════════╣ 
║ 5678  ║ 30/08/2016 ║ 
╠══════════╬════════════╣ 
║ 5678  ║ 30/08/2016 ║ 
╠══════════╬════════════╣ 
║ 5678  ║ 6/09/2016 ║ 
╠══════════╬════════════╣ 
║ 5678  ║ 6/09/2016 ║ 
╠══════════╬════════════╣ 
║ 5678  ║ 7/09/2016 ║ 
╠══════════╬════════════╣ 
║ 5678  ║ 8/09/2016 ║ 
╠══════════╬════════════╣ 
║ 5678  ║ 12/09/2016 ║ 
╚══════════╩════════════╝ 

需要回到這樣的:

 

╔══════════╦═════════════════╦═══════╗ 
║ Customer ║ Week Start Date ║ Count ║ 
╠══════════╬═════════════════╬═══════╣ 
║ 1234  ║ 22/08/2016  ║ 5  ║ 
╠══════════╬═════════════════╬═══════╣ 
║ 5678  ║ 22/08/2016  ║ 7  ║ 
╠══════════╬═════════════════╬═══════╣ 
║ 5678  ║ 5/09/2016  ║ 5  ║ 
╚══════════╩═════════════════╩═══════╝ 
+0

請提供樣品小提琴瑞普問題 – TheGameiswar

回答

1

經仔細檢查,你的預期結果有點出乎意料給我,因爲你是上市客戶ID以及客戶數量的總和。通常情況下,您只需要每兩週的客戶總數,這是我的查詢應該生成的。

SELECT t.Customer, 
     DATEADD(day, (t.twoWeekPeriod-1)*14 + 3, '2016-01-01') AS [Week Start Date], 
     t.customerCount AS [Count] 
FROM 
(
    SELECT Customer, 
      FLOOR(DATEPART(week, DATEADD(day, -3, Date))/2) AS twoWeekPeriod, 
      COUNT(*) AS customerCount 
    FROM yourTable 
    WHERE Date >= '2016-08-22' 
    GROUP BY Customer, 
      FLOOR(DATEPART(week, DATEADD(day, -3, Date))/2) 
) t 

說明:

  • SQL Server開始1月1日一年中的第一個 「星期」。自您在22-Aug-2016開始日期起,第一週(以及隨後的幾周)將於週五開始。由於您的開始日期是星期一,因此我會將所有日期回滾3天以使所有內容保持一致。
  • 3天后回滾22-Aug-2016,現在是今年第34周的開始。這意味着第35周也應該是這個前兩週的一部分。
  • FLOOR(DATEPART(week, DATEADD(day, -3, Date))/2)組套14天在一個單一的兩週時間內

更新:

正如你所指出的,上面的查詢就不會,如果你的數據業務已超過預期那樣發揮作用一個日曆年。在這種情況下,可以形成單獨使用的天數作爲前兩個星期內2周組,2016-08-22(或者你想要的任何其他日期):

SELECT t.Customer, 
     DATEADD(day, (t.twoWeekPeriod)*14, '2016-08-22') AS [Week Start Date], 
     t.customerCount AS [Count] 
FROM 
(
    SELECT Customer, 
      FLOOR(DATEDIFF(day, '2016-08-22', Date)/14) AS twoWeekPeriod, 
      COUNT(*) AS customerCount 
    FROM yourTable 
    WHERE Date >= '2016-08-22' 
    GROUP BY Customer, 
      FLOOR(DATEDIFF(day, '2016-08-22', Date)/14) 
) t 
+0

但我需要知道每個客戶的交易次數,分爲兩個週期。我的表格包含其他字段(如交易金額),但它們與此問題無關。我只包括與我的問題相關的字段。 – Goolsy

+0

@ user2430812然後,您可以將'Customer'添加到'GROUP BY'列表中,q.v.我的更新迴應。 –

+1

輝煌。謝謝 – Goolsy