sql-server - SQL - 添加所有以前的列和当前列,没有滞后和领先
问题描述
我有一张像
ID YEAR VALUE
----------------------
1 2017 1
1 2018 8
1 2019 0
1 2020 6
1 2021 2
我正在尝试将所有前行 VALUE 列值添加到当前行 VALUE 列值并显示总计。我的结果应该如下:
ID YEAR VALUE TOTAL
----------------------------
1 2017 1 1
1 2018 8 9
1 2019 0 9
1 2020 6 15
1 2021 2 17
我尝试使用 join 和 row_number 来获得这个,但 0 的 2019 值搞砸了。
select *, row_number() over (partition by ID order by YEAR) as RN
into #t1
from tbl
select
t1.VALUE + ISNULL(t2.VALUE, 0),
t1.*
from #t1 as t1
left join #t1 as t2 on t2.ID = t1.ID and (t2.RN + 1) = t1.RN
我用这个查询得到的结果是:
ID YEAR VALUE TOTAL
----------------------------
1 2017 1 1
1 2018 8 9
1 2019 0 8
1 2020 6 6
1 2021 2 8
请问有什么帮助吗?
解决方案
如果您想要与您尝试过的解决方案类似的解决方案:
select *, row_number() over (partition by ID order by YEAR) as RN
into #t1
from tablename;
select
t.id, t.year, t.value, sum(#t1.value) TOTAL
from tablename t inner join #t1
on #t1.id = t.id and #t1.year <= t.year
group by t.id, t.year, t.value;
或者使用子查询计算运行总计:
select t.*,
(select sum(value) from tablename where id = t.id and year <= t.year) TOTAL
from tablename t
请参阅演示。
结果:
> id | year | value | TOTAL
> -: | ---: | ----: | ----:
> 1 | 2017 | 1 | 1
> 1 | 2018 | 8 | 9
> 1 | 2019 | 0 | 9
> 1 | 2020 | 6 | 15
> 1 | 2021 | 2 | 17
推荐阅读
- angular - 渲染子组件后如何保留父组件事件
- lua - 如何修复“尝试索引零值”
- javafx - 防止 JavaFX Tooltip 聚焦后台阶段
- azure - 在 Azure AD 中设置单租户应用程序
- javascript - 嵌入式谷歌地图未在 Firefox 中完全呈现
- vue.js - Easeljs:“createjs.Ticker.paused = true”不起作用
- iccube - 服务器端PDF导出功能
- java - 如何在 Java 中向 Octoprint 发送 POST 请求?
- solr - 按 document.contentType 搜索
- amp-html - 您可以在非 amp 页面上使用 AMP 标签吗?