You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

查询'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;

代码说明

  1. mike_account CTE:先定位到Mike的账户ID和初始余额,避免后续重复查询。
  2. all_transactions CTE:用UNION ALL合并Mike作为付款人和收款人的所有交易,统一金额符号(支出为负,收入为正),保证每条交易独立不重复。
  3. 主查询:按交易日期排序,用窗口函数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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 08:40:05