SQL 运行 使用两列的总计

SQL Running Total Using Two Columns

我有以下示例数据集

ID Type Opening Balance Trans Amount
1 Credit 1000.00 40.00
2 Debit 1000.00 -50.00
3 Debit 1000.00 -20.00
4 Credit 1000.00 10.00
5 Debit 1000.00 -30.00

期初余额是前一天的固定金额。我想要的是用它从第一行开始计算 运行 余额。期望的输出应该如下

ID Type Opening Balance Trans Amount Running Total
1 Credit 1000.00 40.00 1040.00
2 Debit 1000.00 -50.00 990.00
3 Debit 1000.00 -20.00 970.00
4 Credit 1000.00 10.00 980.00
5 Debit 1000.00 -30.00 950.00

到目前为止,我编写的脚本只能对交易金额进行 运行 总计,而不考虑第一行的期初余额

    SELECT SUM([trans amount]) OVER (PARTITION BY id ORDER BY id) from dbo.table1

我如何达到预期的结果

期初余额 值加到您的 window 函数结果就足够了:

SELECT *,
       [Opening Balance] + SUM([Trans Amount]) OVER(ORDER BY [ID]) AS [Running Total]
FROM table1

只要 ID 字段(至少在输入示例中)具有唯一值,就不需要在 window 函数内进行分区。

试试看 here.

注意:通过查看您的查询,我假设您正在使用 SQL 服务器。如果不是这种情况,请在您的 post 中作为标签注明。

我最初的方向与 lemon 的回答相同,但我想出了一种只从第一行添加 [Opening Balance] 的方法也很有用。

您可以制作一个带有 case 的 CTE,它将添加第一行以获得新的总计,然后是原始值的其余部分,然后对新列求和:

with tbl as
(
    select ID
        , Type
        , [Opening Balance]
        , [Trans Amount]
        , case
            when ROW_NUMBER() over (order by ID) = 1 then [Opening Balance] + sum([Trans Amount]) over (order by ID)
            else [Trans Amount]
          end [New Trans Amount]
    from orig_tbl
)
select ID
    , Type
    , [Opening Balance]
    , sum([New Trans Amount]) over (order by ID) [Running Total]
from tbl

这种方式的好处是您随后的期初余额可以在不影响 [Running Total] 的情况下发生变化。

但是,如果 [Opening Balance] 没有变化,那么柠檬的版本就更简单了。