如何解决在SQL查询中结转/结转余额
我创建了一个如下表:
Member_ID | Amount | BringForward | Balance | DateTime
101 -100 2020-08-01 13:12:02.113
101 -200 2020-08-01 14:15:23.115
101 300 2020-08-02 10:25:15.315
101 500 2020-08-05 08:47:56.286
我要添加BringForward和Balance的数据,BringForward将结转前一天的总金额(如果日期为8月1日,它将从数据的第一天起将所有金额总计31七月)。余额为BringForward-金额。
我期望的是:
Member_ID | Amount | BringForward | Balance | DateTime
101 -100 0 100 2020-08-01 13:12:02.113
101 -200 0 200 2020-08-01 14:15:23.115
101 300 -300 0 2020-08-02 10:25:15.315
101 500 0 -500 2020-08-05 08:47:56.286
我尝试过的是:
select MP.MEMBER_ID AS Member_ID,CONCAT(MP.AMT_TXN,MP.AMT_TXN_EX) AS Amount,sum(cast(concat(AMT_TXN,amt_txn_ex) as decimal)) over (order by mp.create_date) AS BringForward,(sum(cast(concat(AMT_TXN,amt_txn_ex) as decimal)) over (order by mp.create_date) - CONCAT(MP.AMT_TXN,MP.AMT_TXN_EX)) AS Balance,MP.CREATE_DATE AS DateTime
from MEMBER_TRANSFER MP
结果是:
Member_ID | Amount | BringForward | Balance | DateTime
101 -100 -100 0 2020-08-01 13:12:02.113
101 -200 -300 -100 2020-08-01 14:15:23.115
101 300 100 -200 2020-08-02 10:25:15.315
101 500 800 300 2020-08-05 08:47:56.286
MEMBER_TRANSFER表:
MEMBER_ID | AMT_TXN | AMT_TXN_EX | CREATE_DATE
101 -100 2020-08-01 13:12:02.113
101 -200 2020-08-01 14:15:23.115
101 300 2020-08-02 10:25:15.315
101 500 2020-08-05 08:47:56.286
解决方法
我认为您需要窗口函数和范围说明:
select
member_id,amount,coalesce(sum(coalesce(amt_txn,0) + coalesce(amt_txn_ex,0)) over(
partition by member_id
order by datetime
range between unbounded preceding and interval 1 day preceding
),0) bringforward,coalesce(sum((coalesce(amt_txn,0)) over(
partition by member_id
order by datetime range between unbounded preceding and interval 1 day preceding
),0) - (coalesce(amt_txn,0) - coalesce(amt_txn_ex,0) balance
from member_transfer m
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。