[英]Dynamic calculation in SQL
我在sql表中有以下数据
t1 t2 t3 t4
01/11/2013 8087 8087 7752 7752
01/12/2013 16705 14979 14972 14959
01/01/2014 12933 12781 12781 x1
01/02/2014 12273 12248 y1 x2
01/03/2014 8155 z1 y2 x3
我想做的是用上面的实际值的平均差乘以以前的值来填充缺失值x,y,z,如以下计算所示。
z1 = 8155 * (sum(12781+12248)/ sum(12933+12273))
y1 = 12248 * (sum(14972+12781)/ sum(14979+12789))
y2 = z1 * (sum(14972+12781)/ sum(14979+12789))
x1 = 12781 * (sum(7752+14949)/ sum(7752+14972))
x2 = y1 * (sum(7752+14949)/ sum(7752+14972))
x3 = y2 * (sum(7752+14949)/ sum(7752+14972))
如果该链接在此处未清晰显示,则希望该链接将以更清晰的格式显示数据。 我可以写一个case语句,但是这个表每个月都会增长,并且想知道什么是最有效的编码方式。 每个月的实际值都会出现在第一个缺失值上。 因此,下个月将出现x1,y1,z1的实际值,并且计算将移至右边的一个值。 因此,y2 = z1 *((12781 + y1)/(12781 + 12248))的新计算。 任何帮助将不胜感激。
不确定我是否正确理解,但是到这里,我认为您正在寻找如下查询:
;with cte1 as (
select startdate,
t1,
t2 = case when row_number() over (order by startdate) > 4 then
(t1*(z1param1+z1param2)/convert(float, z1param3+z1param4))
else t2 end,
a.x1param1, a.x1param2,
b.y1param1, b.y1param2,
c.z1param1, c.z1param2, c.z1param3, c.z1param4,
t3,
t4
from #yourCalc cross apply
(
select t4 as x1param1, x1param2 = lead(t4) over(order by startdate)
,RowNa = row_number() over(order by startdate) from #yourCalc
) a
cross apply (
select t3 as y1param1, y1param2 = lead(t3) over(order by startdate)
,RowNb = row_number() over(order by startdate) from #yourCalc
) b
cross apply (
select t2 as z1param1, z1param2 = lead(t2) over(order by startdate)
, t1 as z1param3, z1param4 = lead(t1) over(order by startdate),
RowNc = row_number() over(order by startdate) from #yourCalc
) c
where a.RowNa = 1
and b.RowNb = 2
and c.RowNc = 3
), cte2 as (
select *,
t31 = case when row_number() over (order by startdate) > 3 then
(t2*(y1param1+y1param2)/convert(float, y1param1+y1param2))
else t3 end
from cte1)
, cte3 as (
select *,
t41 = case when row_number() over (order by startdate) > 2 then
(t31*(x1param1+x1param2)/convert(float, x1param1+x1param2))
else t4 end
from cte2)
select startdate, t1, t2, t31 as t3, t41 as t4 from cte3
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.