2016-08-17 5 views
1

고객 트랜잭션 데이터가 포함 된 테이블 ('transactions')이 있습니다. 각 행에는 고객 번호와 거래 날짜가 들어 있습니다. 정의 된 2 주 기간 동안 각 고객이 보유한 총 트랜잭션 수를 표시해야합니다. 모든 고객의 2 주 기간은 2016 년 8 월 22 일에 시작됩니다. 따라서 각 고객이 228/2106 년 이후로 2 주간의 롤링 기간 동안 얼마나 많은 거래를했는지 알아야합니다.2 주 단위로 그룹화하십시오.

고객 번호, 각 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

문제를 repro 수하는 샘플 바이올린을 제공하세요 – TheGameiswar

답변

1

를, 당신의 예상 결과는 나에게 조금 의외입니다 고객 수의 합계와 함께 고객 ID. 일반적으로 각 2 주 기간 동안 총 고객 수를 예상 할 수 있습니다. 이는 아래의 내 쿼리가 생성해야하는 것입니다.

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 서버는 1 월 1 일에 올해의 최초의 "주"를 시작합니다. 22-Aug-2016에 시작일부터 첫 주 (및 모든 후속 주)가 금요일에 시작되었습니다. 귀하의 시작 날짜가 월요일이기 때문에 나는 모든 일을 정렬하기 위해 모든 날짜를 3 일 롤백합니다.
  • 22-Aug-2016을 3 일 뒤로 굴려서 이제 올해의 34 번째 주에 시작됩니다. 이것은 35 주 또한이 첫 2 주 그룹의 일부이어야 함을 의미합니다. 한 2 주 기간에
  • FLOOR(DATEPART(week, DATEADD(day, -3, Date))/2) 그룹 함께 14 일 세트를

업데이트 : 당신이 지적

, 위의 쿼리는 데이터가보다 더 걸쳐있는 경우 의도 한대로 작동하지 않습니다 1 년. 이 경우 처음 두 주 동안 역할을 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

그러나 각 고객에 대한 트랜잭션 수를 2 주 단위로 그룹화해야합니다. 내 테이블에 다른 필드 (거래 금액 등)가 있지만이 문제와 관련이 없습니다. 내 질문과 관련된 분야 만 포함했습니다. – Goolsy

+0

@ user2430812 그러면 '고객'을 'GROUP BY'목록에 추가 할 수 있습니다. q.v. 내 업데이트 된 응답. –

+1

Brilliant. 감사합니다. – Goolsy

관련 문제