Sql server 在同一查询中使用上一年的数据

Sql server 在同一查询中使用上一年的数据,sql-server,tsql,Sql Server,Tsql,下面是我当前的查询,我有一个CTE,它计算我的每个财政期间的收入,这些财政期间按诊所及其各自的交易分组。然后是一个查询,该查询查看各个诊所的工作天数,并查找每日平均值,计算当前天数和基于预期天数的预计收入 这个查询可以正常工作;但是,我需要再添加一些列。我还想显示上一年的收入,因此在本例中,我将查询限制为仅显示2016年和第9期,上一年的收入应显示2015年第9期的收入,还需要查看上一年的天数,我认为这将是一个类似的过程 WITH CTE_Revenue AS( SELECT c.Clinic

下面是我当前的查询,我有一个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还是相当陌生的。感谢您提前提供的建议和帮助

编辑:下面是使用SQL Server关系图的表结构和关系的图像: 您可以使用多个

像这样:

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

很乐意帮忙@OMASPHYXIATE将上一年的数据应用到您从最终选择报表中看到的w/e年度,调整该数据的最佳方式不限于2016/2015年。我将把这一点添加到包括cte中,rn=按诊所顺序按财政描述划分的行数。在上一个查询的子查询中:将where-fiscalyear=2016更改为where-rn=1,将where-fiscalyear=2015更改为where-rn=2。