首页 > 解决方案 > 在上一行内的相同计算值上创建计算值

问题描述

我正在尝试制作一个脚本来使用基于此表的 SQL 计算“SHI”列。

| Day | BR  | BR2 | HI  |  SHI   |
----------------------------------
|  1  | 0   |  0  | 0   |  0     |
|  2  | 400 | 400 | 95  |  95    |
|  3  | 0   | 400 | 0   |  95    |
|  4  | 350 | 750 | 100 |  97.33 |
|  5  | 350 |1100 | 100 |  98.18 |

我需要使用以下方法计算 SHI 列:

SHI  =  ((BR * HI) + (Prev.SHI * Prev.BR2)) / BR2

需要明确的是,我的数据中尚不存在 SHI 列。这就是我试图让我的查询计算的内容。我的问题是,我不知道如何将之前的 SHI 值插入到当天的公式中。

知道如何在 SQL 中创建它吗?

标签: sqlsql-server

解决方案


使用 cte,您可以达到您想要的结果。

with cte as 
(
select day,br,br2,hi,(case when br2<>0 and br2 is not null then coalesce(round( ((br*hi))/br2,2),0) else 0 end)SHI from S66312677V2 where day=1
union all 
select s.day,s.br,s.br2,s.hi,
(case when s.br2<>0 and s.br2 is not null then coalesce(round( ((s.br*s.hi)+cte.shi*cte.br2)/s.br2,2),0) else 0 end)SHI from S66312677V2 s
inner join cte on s.day-1=cte.day
where s.day<>1
)
select * from cte

输出:

在此处输入图像描述

如果行数超过 100,则使用OPTION (MAXRECURSION xxx)设置更大的递归限制,最高可达 32,767,如下所示:

    with cte as 
        (
        select day,br,br2,hi,(case when br2<>0 and br2 is not null then coalesce(round( ((br*hi))/br2,2),0) else 0 end)SHI from S66312677V2 where day=1
        union all 
        select s.day,s.br,s.br2,s.hi,
        (case when s.br2<>0 and s.br2 is not null then coalesce(round( ((s.br*s.hi)+cte.shi*cte.br2)/s.br2,2),0) else 0 end)SHI from S66312677V2 s
        inner join cte on s.day-1=cte.day
        where s.day<>1
        )
        select * from cte
OPTION (MAXRECURSION 999)

推荐阅读