查询'Mike Johnson'账户交易累计余额及相关交易信息
解决查询Mike Johnson交易累计余额的SQL方案
问题分析
你需要查询Mike Johnson名下所有交易的日期、单笔金额及累计余额,输出指定列名。现有代码存在几个问题:
- 表名错误:把
fact_transactions写成了act_transactions - 关联方式错误:直接Join会导致付款和收款记录交叉重复,无法正确列出每条独立交易
- 未筛选目标用户
Mike Johnson - 未合并收支金额,也未计算正确的累计余额(需结合初始账户余额+每笔交易的收支变动)
正确SQL代码
WITH mike_account AS ( -- 获取Mike的账户ID和初始余额 SELECT Account_id, balance AS initial_balance FROM dim_accounts WHERE Name = 'Mike Johnson' ), all_transactions AS ( -- 整理所有涉及Mike的交易:付款记为负,收款记为正 SELECT ma.Account_id, ft.Transaction_date, -ft.Amount AS transaction_amount -- 作为付款人,金额为支出 FROM mike_account ma JOIN fact_transactions ft ON ma.Account_id = ft.Payer_id UNION ALL SELECT ma.Account_id, ft.Transaction_date, ft.Amount AS transaction_amount -- 作为收款人,金额为收入 FROM mike_account ma JOIN fact_transactions ft ON ma.Account_id = ft.Receiver_id ) SELECT 'Mike Johnson' AS name, transaction_date, transaction_amount, -- 计算累计余额:初始余额 + 截止当前日期的所有交易金额总和 ma.initial_balance + SUM(transaction_amount) OVER (ORDER BY transaction_date) AS cumulative_balance FROM all_transactions at CROSS JOIN mike_account ma ORDER BY transaction_date;
代码说明
- mike_account CTE:先定位到Mike的账户ID和初始余额,避免后续重复查询。
- all_transactions CTE:用
UNION ALL合并Mike作为付款人和收款人的所有交易,统一金额符号(支出为负,收入为正),保证每条交易独立不重复。 - 主查询:按交易日期排序,用窗口函数
SUM() OVER (ORDER BY transaction_date)计算累计交易金额,加上初始余额得到累计余额,同时指定需求要求的列名。
补充说明
- 如果交易日期有重复(同一天多笔交易),窗口函数会默认把同一天的交易合并计算累计;若需要按交易顺序精确计算,可在
ORDER BY里加上Transaction_id:ORDER BY transaction_date, Transaction_id - 若不需要包含初始余额,仅计算交易本身的累计收支,直接用
SUM(transaction_amount) OVER (ORDER BY transaction_date)即可
内容的提问来源于stack exchange,提问作者JAmes CCP
相关产品推荐
相关产品推荐

