2014-12-04 4 views
0

데이터가 두 테이블 ORDERStraining에 있습니다. 다양한 고객에게 다양한 교육이 제공됩니다. 관련된 교육을받은 고객에게 수익에 미치는 영향에 대해 알고 싶습니다. 이를 달성하기 위해 교육을받은 날짜로부터 각 고객에 대한 지난 90 일 및 미래 90 일 동안의 수익을 살펴보고자합니다. 다시 말해 2014 년 3 월 30 일에 고객이 교육을받은 경우 2014 년 1 월 1 일부터 2014 년 6 월 30 일까지의 수익을보고 싶습니다. 다음과 같은 쿼리를 작성했습니다.특정 날짜를 기준으로 과거 데이터 선택 및 그룹화

교육은 고객 번호 (100)에 대해 3 월 15 일 2014 년 제공 한 경우 내가 수익을 원하는 것,

:

custno Revenue TrainingDate RevenueMonth 
0000100 159.20 2014-06-02 00:00:00.000 2014-03-01 00:00:00.000 
0000100 199.00 2014-06-02 00:00:00.000 2014-04-01 00:00:00.000 
0000100 79.60 2014-06-02 00:00:00.000 2014-05-01 00:00:00.000 
0000100 29.85 2014-06-02 00:00:00.000 2014-06-01 00:00:00.000 
0000100 79.60 2014-06-02 00:00:00.000 2014-07-01 00:00:00.000 
0000100 99.50 2014-06-02 00:00:00.000 2014-08-01 00:00:00.000 
0000250 437.65 2013-02-26 00:00:00.000 2012-11-01 00:00:00.000 
0000250 4181.65 2013-02-26 00:00:00.000 2012-12-01 00:00:00.000 
0000250 4146.80 2013-02-26 00:00:00.000 2013-01-01 00:00:00.000 
0000250 6211.93 2013-02-26 00:00:00.000 2013-02-01 00:00:00.000 
0000250 2199.72 2013-02-26 00:00:00.000 2013-03-01 00:00:00.000 
0000250 4452.65 2013-02-26 00:00:00.000 2013-04-01 00:00:00.000 

원하는 출력 예 :

select 
    o.custno, 
    sum(ISNULL(a.revenue,0)) as Revenue, 
    o.Date as TrainingDate, 
    DATEADD(mm, DATEDIFF(mm, 0, a.created), 0) as RevenueMonth 
from ORDERS a, 
    (select distinct custno, max(Date) as Date from Training group by custno) o 
where a.custnum = o.custno 
    and a.created between DATEADD(day, -90, o.Date) and DATEADD(day, 90, o.Date) 
group by o.custno, o.Date, DATEADD(mm, DATEDIFF(mm, 0, a.created), 0) 
order by o.custno 

이 쿼리의 샘플 출력은 다음과 같이 보입니다 다음 형식의 데이터 :

CustNo  Revenue   TrainingDate      RevenueMonth 
100 <Some revenue figure> March 15 2014  Dec 15 2013 – Jan 14 2014 (Past month 1) 
100 <Some revenue figure> March 15 2014  Jan 15 2014 – Feb 14 2014 (Past month 2) 
100 <Some revenue figure> March 15 2014  Feb 15 2014 – Mar 14 2014 (Past month 3) 
100 <Some revenue figure> March 15 2014  Mar 15 2014 – Apr 14 2014 (Future month 1) 
100 <Some revenue figure> March 15 2014  Apr 15 2014 – May 14 2014 (Future month 2) 
100 <Some revenue figure> March 15 2014  May 15 2014 – Jun 14 2014 (Future month 3) 

여기에서 RevenueMonth 열은 교육 날짜에 상대적인 데이터 인 경우이 형식이 아니어도됩니다. 중괄호에있는 '과거'및 '미래'월 참조는 출력을 설명하기위한 것이지 출력에 표시 할 필요가 없습니다.

내 쿼리는 데이터를 가져 와서 데이터를 월 단위로 그룹화합니다. 나는 그 달들을 훈련 날짜에 비례하여 그룹화하고 싶습니다. 예를 들어 - 훈련이 3 월 15 일에 주어진다면, 나는 지난 달이 2 월 15 일에서 3 월 14 일까지이고, 나의 질문은 그렇게하지 않는다. 나는이 쿼리에서 약간의 비틀기만으로도 내가 한 일을 성취 할 수 있다고 생각한다.

위와 같은 질문에 대한 도움을 주시면 감사하겠습니다. 이 라인을 따라

+0

시각화 질문 쿼리 질문에서 확실히 분리되어 업데이트보다 명확하게하기 위해, 조인 구문을 현대적인 사용, 그리고 더 나은 별도로 요구된다. –

+0

제안에 감사드립니다. 지금 질문을 수정했습니다. – Patthebug

+0

교육의 효과를보고 있다면 왜 교육 전의 수익을 통해 수익을 거두고 있습니까? –

답변

1

뭔가 당신이 원하는 것을 할 수 있습니다

select 
    t.custno, 
    sum(ISNULL(o.revenue,0)) as Revenue, 
    t.maxDate as TrainingDate, 
    ((DATEDIFF(day, TrainingDate, o.created) + 89)/30) - 3 as DeltaMonth 
from ORDERS o 
    join (select custno, max([Date]) as maxDate from Training group by custno) t 
    on o.custnum = t.custno 
where o.created 
    between DATEADD(day, -89, t.maxDate) and DATEADD(day, 90, t.maxDate) 
group by t.custno, t.maxDate, DeltaMonth 
order by t.custno 

일반적인 전략 개월 차이를 계산하는 것이다 (또는 30 일의 기간, 정말) 그하여 훈련 날짜 및 그룹에서. 이 버전은 훈련 후 89 일에서 90 일까지 사용합니다. 왜냐하면 -90에서 +90까지 실행하면 30 일 기간으로 균등하게 나누는 것보다 하루가 더 많기 때문입니다 (훈련 날 자체).

질의는 원래의 일반적인 구조를 따르지만, 여러 가지 변화가 : 그것은 계산

  • DeltaMonth (-3 2) 훈련 기간에 대해 30 일주기의 지표로서, 훈련 일은 DeltaMonth 번호 -1의 마지막 날입니다.
  • GROUP BY 절에 DeltaMonth 별칭을 사용하여 해당 수식을 반복하지 않습니다. 이는보다 명확하고 단순하며 유지 보수성이 뛰어납니다.
  • 테이블 별칭이 변경되었습니다. 나는 단순히 "ORDERS"라는 별명과 "o"라는 별명이있는 테이블을 처리 할 수 ​​없다.
  • 쿼리는
  • GROUP BY 절은 적절
+0

답장을 보내 주셔서 감사합니다. 정말로 감사드립니다. 쿼리를 실행 중이며 ORDERS 테이블에 수십만 개의 레코드가 있으므로 시간이 걸립니다. group by 절에서 DeltaMonth를 수식 (아마도 우리가 사용하는 SQL Server 버전의 차이)으로 변경해야했습니다. 테이블 별칭과 조인 구문에 감사드립니다. 둘 다 완벽합니다. 쿼리가 결과를 반환하면 업데이트됩니다. – Patthebug

+0

쿼리에서 반환 한 결과가 올바르게 표시됩니다. 감사합니다. 대단히 감사합니다. – Patthebug

관련 문제