首页 > 解决方案 > 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

请问有什么帮助吗?

标签: sql-serversql-server-2008-r2common-table-expressionrow-number

解决方案


如果您想要与您尝试过的解决方案类似的解决方案:

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

推荐阅读