首页 > 解决方案 > 使用减法 SQL 运行总计

问题描述

我有以下示例数据集

ID 日期 平衡
116210 2021 年 4 月 16 日 570,788
116210 2021 年 4 月 17 日 57,152
116210 2021 年 4 月 18 日 57,152,106
116210 2021 年 4 月 19 日 5,549,211
116210 2021 年 4 月 20 日 5,748,370
116210 2021 年 4 月 21 日 5,425,046

我想要做的是监控余额的日常变动如下

ID 日期 平衡 移动
116210 2021 年 4 月 16 日 570,788 0
116210 2021 年 4 月 17 日 57,152 (513,636)
116210 2021 年 4 月 18 日 57,152,106 57,094,954
116210 2021 年 4 月 19 日 5,549,211 (51,602,895)
116210 2021 年 4 月 20 日 5,748,370 199,159
116210 2021 年 4 月 21 日 5,425,046 (323,324)

我写了以下脚本

   SELECT id, 
      [date],
      balance,
    balance-SUM([balance]) OVER (PARTITION BY [id] ORDER BY [id],[date])
    AS movement
    FROM [corporate].[dbo].[balances_apr]

但是,它是添加余额而不是减去

标签: sqlsql-servertsql

解决方案


您可以使用 LAG 函数并从 Balance 中减去,如下所示:

DECLARE @test table(ID  int, vDATE date,    BALANCE int)

insert into @test values
(116210 ,'4/16/2021',   570788      )
,(116210    ,'4/17/2021',   57152       )
,(116210    ,'4/18/2021',   57152106    )
,(116210    ,'4/19/2021',   5549211     )
,(116210    ,'4/20/2021',   5748370     )
,(116210    ,'4/21/2021',   5425046     );

SELECT ID, VdATE, Balance, iif(balance = movement, 0, movement) as movement FROM
(
SELECT ID,VDate, Balance, balance - LAG(Balance,1,0) over (partition by id order by vDate) as movement FROM @test
) AS T
ID 日期 平衡 移动
116210 2021-04-16 570788 0
116210 2021-04-17 57152 -513636
116210 2021-04-18 57152106 57094954
116210 2021-04-19 5549211 -51602895
116210 2021-04-20 5748370 199159
116210 2021-04-21 5425046 -323324

推荐阅读