2017-01-24 1 views
1

다음은 현재 나의 쿼리입니다. 클리닉과 해당 거래별로 그룹화 된 각 회계 기간의 수익을 계산하는 CTE가 있습니다. 개별 클리닉의 근무일을 살펴보고 예상 일수를 기준으로 일일 평균 (현재 날짜 계산) 및 예상 수익을 찾는 쿼리가 이어집니다.동일한 검색어로 전년도 데이터 사용

이 쿼리는 정상적으로 작동합니다. 그러나 나는 더 많은 컬럼을 추가 할 필요가있다. 전년도의 수익도 표시하고 싶습니다.이 경우 검색어를 2016 년과 9 기간으로 제한하고 전년도 수익은 2015 년 9 월에 표시해야하며 전년도의 일을 볼 필요가 있습니다 뿐만 아니라 (나는 비슷한 과정이 될 것이라고 생각한다).

WITH CTE_Revenue AS(
SELECT c.Clinic, 
     c.ClinicID, 
     SUM(td.Amount)*-1 AS Revenue, 
     p.PeriodID, 
     p.FiscalYear 
FROM Trans.TransactionHeader th 
JOIN Clinic.[Master] c 
    ON (th.ClinicID = c.ClinicID) 
JOIN Trans.TransactionDetail td 
    ON (th.ClinicID = td.ClinicID AND th.TranNum = td.TranNum) 
JOIN Clinic.EOD e 
    ON (th.ClinicID = e.ClinicID AND th.TranNum BETWEEN e.StartTran AND e.EndTran) 
JOIN Clinic.Period p 
    ON (CAST(e.TimeRan AS date) BETWEEN p.PeriodStart AND p.PeriodEnd) 
AND th.Impacts='C' 
GROUP BY c.Clinic, c.ClinicID, p.PeriodID, p.FiscalYear) 

SELECT w.Clinic, 
     w.Revenue, 
     (w.Revenue/days.CurrentDays) AS DailyAverage, 
     (w.Revenue/days.CurrentDays)*d.PeriodDays AS ProjectedRevenue 
FROM CTE_Revenue w 
JOIN Clinic.Dates d 
    ON (w.ClinicID = d.ClinicID AND w.PeriodID = d.PeriodID AND w.FiscalYear = d.FiscalYear) 
JOIN ( SELECT DISTINCT 
     td.ClinicID, 
     COUNT(DISTINCT td.DateEntered) AS CurrentDays, 
     p.PeriodID, 
     p.FiscalYear 
    FROM Trans.TransactionDetail td 
    JOIN Clinic.Period p 
     ON td.DateEntered BETWEEN p.PeriodStart AND p.PeriodEnd 
    GROUP BY td.ClinicID, p.PeriodID, p.FiscalYear) AS days 
    ON (w.ClinicID = days.ClinicID AND w.PeriodID=days.PeriodID AND w.FiscalYear = days.FiscalYear) 
WHERE w.FiscalYear = 2016 
AND w.PeriodID = 9 

SELECT 문을 결과로 끝 나는 상상, 다음과 같이 보일 것입니다 :

이 쿼리가 완전히 최적화되지 않을 수 있습니다
SELECT w.Clinic, 
     w.Revenue, 
     (w.Revenue/days.CurrentDays) AS DailyAverage, 
     (w.Revenue/days.CurrentDays)*d.PeriodDays AS ProjectedRevenue, 
     PrevYear.Revenue, 
     (PrevYear.Revenue/PrevYear.CurrentDays) AS PYDailyAverage, 
     (PrevYear.Revenue/PrevYear.CurrentDays)*d.PeriodDays AS PYCalculated 

, 난 여전히 SQL에 비교적 새로운 해요. 미리 조언 해 주셔서 감사합니다.

편집 : 이 Table Diagram

답변

1

당신이처럼 여러 ctes

를 사용할 수 있습니다 :

with cte_Revenue as(
    select 
     c.Clinic 
    , c.Clinicid 
    , Revenue = sum(td.Amount)*-1 
    , p.Periodid 
    , p.FiscalYear 
    from Trans.TransactionHeader th 
    inner join Clinic.[Master] c 
    on (th.Clinicid = c.Clinicid) 
    inner join Trans.TransactionDetail td 
    on th.Clinicid = td.Clinicid 
    and th.TranNum = td.TranNum 
    inner join Clinic.eod e 
    on th.Clinicid = e.Clinicid 
    and th.TranNum between e.StartTran and e.EndTran 
    inner join Clinic.Period p 
     on (cast(e.TimeRan as date) between p.PeriodStart and p.PeriodEnd) 
    and th.Impacts='C' 
    group by 
     c.Clinic 
    , c.Clinicid 
    , p.Periodid 
    , p.FiscalYear 
) 
, include_py as (
    select 
     w.Clinic 
     , w.Revenue 
     , w.Periodid 
     , w.FiscalYear 
     , DailyAverage = (w.Revenue/days.CurrentDays) 
     , ProjectedRevenue = (w.Revenue/days.CurrentDays)*d.PeriodDays 
    from cte_Revenue w 
     inner join Clinic.Dates d 
     on w.Clinicid = d.Clinicid 
     and w.Periodid = d.Periodid 
     and w.FiscalYear = d.FiscalYear 
     inner join (
     select distinct 
       td.Clinicid 
      , CurrentDays = count(distinct td.DateEntered) 
      , p.Periodid 
      , p.FiscalYear 
      from Trans.TransactionDetail td 
      inner join Clinic.Period p 
       on td.DateEntered between p.PeriodStart and p.PeriodEnd 
      group by 
       td.Clinicid 
      , p.Periodid 
      , p.FiscalYear 
    ) as days 
      on w.Clinicid = days.Clinicid 
      and w.Periodid=days.Periodid 
      and w.FiscalYear = days.FiscalYear 
    where w.FiscalYear in (2015,2016) 
     and w.Periodid = 9 
) 
select 
    c.Clinic 
    , c.FiscalYear 
    , c.PeriodId 
    , c.Revenue 
    , c.DailyAverage 
    , c.ProjectedRevenue 
    , pyRevenue = p.Revenue 
    , pyDailyAverage = p.DailyAverage 
    , pyProjectedRevenue = p.ProjectedRevenue 
from (select * from include_py where fiscalyear = 2016) c 
    left join (select * from include_py where fiscalyear = 2015) p 
    on c.Clinic = p.Clinic 

Bad Habits to Kick : Using AS instead of = for column aliases - Aaron Bertrand

+0

여기에 SQL 서버 다이어그램을 사용하여 테이블 구조와 관계의 이미지입니다 이것은 잘 될 것입니다 통찰력을 주셔서 감사합니다 –

+0

해피 도와주세요! @OMAsphyxiate – SqlZim

+0

2016/2015에만 국한되지 않고 최종 SELECT 문에서보고있는 전년도 데이터를 적용하는 가장 좋은 방법은 –

관련 문제