繁体   English   中英

SQL中的动态计算

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM