在 SQL 个减法交易中创建 运行 个账户余额
Create Running Account Balance in SQL Subtracting Transactions
我有一个 table 看起来像这样:
account#
Transaction_Date
StartDayBalance
TransactionAmt
Partition
1
2012-03-20
0
1
1
2012-03-20
0
2
1
2012-03-21
5
1
1
2012-03-21
5
2
1
2012-03-21
5
3
2
2012-03-20
0
1
2
2012-03-20
0
2
我需要能够在每次交易后按帐户和按天隔离 运行 余额。到目前为止,我对 运行 总计所做的研究假设您要加在一起的内容在同一列中,但在本例中并非如此。
“分区”列不在原来的 table 中,我添加了它,因为我希望这会有所帮助。
我要实现的输出是:
account#
Transaction_Date
StartDayBalance
TransactionAmt
Partition
Avail_bal
1
2012-03-20
0
1
5
1
2012-03-20
0
2
5
1
2012-03-21
5
1
0
1
2012-03-21
5
2
0
1
2012-03-21
5
3
5
2
2012-03-20
0
1
2
2012-03-20
0
2
我试过类似的方法,但失败得很厉害:
sum(startdaybalance - transactionamt) over(partition by account#,transaction_date,order by account#,transaction_date) as avail_bal
结果是对剩余余额求和,这是不对的。
然后我尝试了一个案例,当系列很快变得丑陋并且也不起作用时:
set avail_bal = case when partition=1 then (startdaybalance - transactionamt)
when partition=2 then (case when partition=1 then (startdaybalance - transactionamt) end) - transactionamt
when partition =3 then (case when partition=2 then (startdaybalance - transactionamt) end) - transactionamt end
这也不是特别可持续,因为我要处理数百万行交易,有时一个人有 50 多笔交易。
此处提供任何有关如何使“avail_bal”列适当执行的指导,我们将不胜感激。这是在 SQL 服务器上。
你已经差不多搞定了,只需要换成
startdaybalance
- sum(transactionamt) over (partition by account#, transaction_date
order by partition_no) as avail_bal
不要在 sum()
中包含 startdaybalance
,这意味着您要对 (startdaybalance - transactionamt)
求和并求和
此外 account#, transaction_date
已经在 partition by
中,没有意义再次出现在 order by
中
请避免使用关键字作为列名或别名 (partition
)。
我有一个 table 看起来像这样:
account# | Transaction_Date | StartDayBalance | TransactionAmt | Partition |
---|---|---|---|---|
1 | 2012-03-20 | 0 | 1 | |
1 | 2012-03-20 | 0 | 2 | |
1 | 2012-03-21 | 5 | 1 | |
1 | 2012-03-21 | 5 | 2 | |
1 | 2012-03-21 | 5 | 3 | |
2 | 2012-03-20 | 0 | 1 | |
2 | 2012-03-20 | 0 | 2 |
我需要能够在每次交易后按帐户和按天隔离 运行 余额。到目前为止,我对 运行 总计所做的研究假设您要加在一起的内容在同一列中,但在本例中并非如此。 “分区”列不在原来的 table 中,我添加了它,因为我希望这会有所帮助。
我要实现的输出是:
account# | Transaction_Date | StartDayBalance | TransactionAmt | Partition | Avail_bal |
---|---|---|---|---|---|
1 | 2012-03-20 | 0 | 1 | 5 | |
1 | 2012-03-20 | 0 | 2 | 5 | |
1 | 2012-03-21 | 5 | 1 | 0 | |
1 | 2012-03-21 | 5 | 2 | 0 | |
1 | 2012-03-21 | 5 | 3 | 5 | |
2 | 2012-03-20 | 0 | 1 | ||
2 | 2012-03-20 | 0 | 2 |
我试过类似的方法,但失败得很厉害:
sum(startdaybalance - transactionamt) over(partition by account#,transaction_date,order by account#,transaction_date) as avail_bal
结果是对剩余余额求和,这是不对的。
然后我尝试了一个案例,当系列很快变得丑陋并且也不起作用时:
set avail_bal = case when partition=1 then (startdaybalance - transactionamt)
when partition=2 then (case when partition=1 then (startdaybalance - transactionamt) end) - transactionamt
when partition =3 then (case when partition=2 then (startdaybalance - transactionamt) end) - transactionamt end
这也不是特别可持续,因为我要处理数百万行交易,有时一个人有 50 多笔交易。
此处提供任何有关如何使“avail_bal”列适当执行的指导,我们将不胜感激。这是在 SQL 服务器上。
你已经差不多搞定了,只需要换成
startdaybalance
- sum(transactionamt) over (partition by account#, transaction_date
order by partition_no) as avail_bal
不要在 sum()
中包含 startdaybalance
,这意味着您要对 (startdaybalance - transactionamt)
求和并求和
此外 account#, transaction_date
已经在 partition by
中,没有意义再次出现在 order by
请避免使用关键字作为列名或别名 (partition
)。