【问题标题】:Adding values from previous row into current row将前一行的值添加到当前行
【发布时间】:2020-05-10 06:50:58
【问题描述】:

我有一个简单的表,我想将前一行的值添加到当前行中,并将当前行的值添加到下一行中,这样它就会一直持续到最后。

请看下表数据。

ID  Value ValueIncrement 
1     2          0
2     3          5  (2+3)
3     9          14 (2+3+9)
4     6          20 (2+3+9+6)
5     3          23 (2+3+9+6+3) 
6     1          24 (2+3+9+6+3+1)  
7     2          26 (2+3+9+6+3+1+2)
8     0          26 (2+3+9+6+3+1+2+0)
9     2          30 (2+3+9+6+3+1+2+0+2)

我正在寻找一个可以让我连续添加值的选择查询。

【问题讨论】:

  • 为什么ValueIncrement从0开始,应该是2?

标签: sql sql-server select sum sql-server-2014


【解决方案1】:

你可以做一个窗口求和:

select id, value, sum(value) over (order by id) valueincrement
from mytable
order by id

Demo on SQL Server 2014 Fiddle

编号 |价值 |增值 -: | ----: | -------------: 1 | 2 | 2 2 | 3 | 5 3 | 9 | 14 4 | 6 | 20 5 | 3 | 23 6 | 1 | 24 7 | 2 | 26 8 | 0 | 26 9 | 2 | 28

【讨论】:

  • 欢迎@user3778549!如果我的回答正确回答了您的问题,请点击复选标志accept it。您也可以投票赞成它,以及您认为有用的所有其他答案。
【解决方案2】:

如果您使用的是小表,也可以使用correlated sub-query(否则,出于性能原因,如果您可以使用窗口函数,则绝对不应该使用这种方法)。我假设您以 0 开头的 valueincrement 列是一个错字,而不是设计使然。如果不是,请告诉我们。

select *, (select sum(value) from mytable t2 where t1.id >= t2.id) as valueincrement
from mytable t1
order by id;

【讨论】:

    【解决方案3】:

    你可以试试递归求和

    INSERT INTO #tmpPrueba
    VALUES(2),(3),(9),(6),(3),(1),(2),(0),(2)
    
    CREATE TABLE #tmpTest
    (nId INT IDENTITY(1,1),
    nValor INT NOT NULL)
    
    SELECT *
    FROM #tmpTest;
    
    SELECT SUM(nValor) OVER (ORDER BY nId ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)
    FROM #tmpTest;
    

    【讨论】:

    • 感谢您的思考,GMB 很好地满足了当前的需求。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多