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