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]
没有变化,那么柠檬的版本就更简单了。
我有以下示例数据集
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]
没有变化,那么柠檬的版本就更简单了。