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

SQL实现Running Balance(滚动余额):账户交易查询格式需求

实现带滚动余额(Running Balance)的账户交易报表

我来帮你搞定这个需求——要生成带滚动余额的交易记录,核心是利用窗口函数(或者旧版数据库用变量)按交易顺序累计计算余额。结合你的原查询和目标格式,给你两种可行方案:


方案1:支持窗口函数的现代数据库(MySQL 8.0+、SQL Server、PostgreSQL等)

这是最简洁高效的写法,直接用SUM() OVER()窗口函数来计算滚动余额:

SELECT 
    TranRef,
    TrnDate,
    AcNumber,
    AcName,
    DrCr,
    amount,
    -- 按交易顺序累计计算余额:Cr加、Dr减
    SUM(CASE WHEN DrCr = 'Cr' THEN amount ELSE -amount END) 
        OVER (ORDER BY TrnDate, TranRef) AS RunningBalance
FROM 
    Accounts 
JOIN Voucher ON Accounts.acid = voucher.accountno 
JOIN Transactions ON Transactions.TrnRef = Voucher.TranRef 
WHERE 
    acnumber = 1010
-- 确保结果按交易时间顺序展示,和余额计算逻辑一致
ORDER BY 
    TrnDate, TranRef;

关键逻辑说明:

  • CASE WHEN DrCr = 'Cr' THEN amount ELSE -amount END:把借贷转换为正负数值,Cr(贷方)对应正金额(余额增加),Dr(借方)对应负金额(余额减少),完全匹配你目标结果里的计算逻辑。
  • SUM(...) OVER (ORDER BY TrnDate, TranRef):窗口函数会按照TrnDate(交易日期)+TranRef(交易编号,避免同一天交易顺序混乱)排序,逐行累计计算总和,得到每一笔交易后的滚动余额。

方案2:兼容旧版本MySQL(低于8.0,不支持窗口函数)

如果你的MySQL版本比较旧,用用户变量来模拟滚动累计:

SELECT 
    TranRef,
    TrnDate,
    AcNumber,
    AcName,
    DrCr,
    amount,
    -- 逐行更新滚动余额变量
    @running_balance := @running_balance + CASE WHEN DrCr = 'Cr' THEN amount ELSE -amount END AS RunningBalance
FROM 
    -- 先把交易记录按时间排序
    (SELECT 
         TranRef,
         TrnDate,
         AcNumber,
         AcName,
         DrCr,
         amount
     FROM 
         Accounts 
     JOIN Voucher ON Accounts.acid = voucher.accountno 
     JOIN Transactions ON Transactions.TrnRef = Voucher.TranRef 
     WHERE 
         acnumber = 1010
     ORDER BY 
         TrnDate, TranRef) AS sorted_transactions
-- 初始化滚动余额变量为0
CROSS JOIN (SELECT @running_balance := 0) AS init;

关键逻辑说明:

  • 先通过子查询把交易按时间顺序排好,确保累计的顺序绝对正确。
  • 用@running_balance变量逐行累加每笔交易的正负值,最终得到滚动余额。

补充:如果账户有初始余额

如果你的账户存在初始余额(比如Accounts表有OpeningBalance字段),只需要在余额计算里加上初始值即可:

-- 方案1示例:
Accounts.OpeningBalance + SUM(CASE WHEN DrCr = 'Cr' THEN amount ELSE -amount END) OVER (ORDER BY TrnDate, TranRef) AS RunningBalance

内容的提问来源于stack exchange,提问作者Ghufran Ataie

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 09:23:56