【问题标题】:SQL - Add all previous columns and current column without lag and leadSQL - 添加所有以前的列和当前列,没有滞后和领先
【发布时间】:2019-08-01 18:22:56
【问题描述】:

我有一张这样的桌子

  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-server sql-server-2008-r2 common-table-expression row-number


    【解决方案1】:

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

    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 
    

    请参阅demo
    结果:

    > id | year | value | TOTAL
    > -: | ---: | ----: | ----:
    >  1 | 2017 |     1 |     1
    >  1 | 2018 |     8 |     9
    >  1 | 2019 |     0 |     9
    >  1 | 2020 |     6 |    15
    >  1 | 2021 |     2 |    17
    

    【讨论】:

      【解决方案2】:

      你需要窗口函数:

      select t.*, sum(t.[value]) over (partition by t.id order by t.[year]) as total
      from #t1 t;
      

      【讨论】:

      • 你能看到语法有什么问题吗?“我在'order'附近遇到不正确的语法”错误:select t.*, sum(t.VALUE) over(partition by t.ID order由 t.YEAR) 来自 #FINAL t
      • @JohnM 这是因为这在 sql server 2008 中不可用。直到 2012 年才可用。有升级的机会吗? 2008 年生命周期结束于上个月。
      • 我认为近期不会有升级,2008年还有其他解决方案吗?我刚刚搜索了窗口函数以获得累积总和,这是我看到这个答案后想要的。非常感谢任何帮助。
      • 你可以在 2008 年做一个累计,但是写起来很痛苦,而且速度也很慢。
      • 我喜欢这个答案,但它不适合我的版本,但感谢您的快速回复
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-11-21
      • 2022-01-23
      • 2018-12-16
      • 1970-01-01
      • 2021-06-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多