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

基于给定交易数据编写MySQL查询语句计算账户余额

解决交易余额累计计算的MySQL查询方案

嘿,我来帮你搞定这个余额计算的需求!先把你的交易数据和需求理清楚:

原始交易数据(假设表名为transactions)

先给你补全表结构和测试数据的SQL,方便你直接测试:

-- 创建交易表
CREATE TABLE transactions (
    Date DATE,
    Trans VARCHAR(50),
    Detail VARCHAR(100),
    Amt DECIMAL(10,2),
    Payment DECIMAL(10,2)
);

-- 插入你提供的测试数据
INSERT INTO transactions VALUES
('2018-05-04', 'Inv', 'Inv_1', 100, 0.00),
('2018-05-04', 'Inv', 'Inv_2', 500, 0.00),
('2018-05-04', 'Payment', 'Inv_1,Inv_2', 0.0, 400),
('2018-05-06', 'Inv', 'Inv_2', 500, 0.00),
('2018-05-06', 'Payment', 'Inv_2', 0.0, 600),
('2018-05-06', 'credit', 'credit', 500, 0.00),
('2018-05-08', 'Inv', 'Inv_3', 100, 0.00);

实现余额计算的查询语句

要得到逐行累计的余额,核心逻辑是每一行的余额 = 之前所有行的(Amt - Payment)之和。这里分两种情况给你方案:

方案1:MySQL 8.0+(支持窗口函数,推荐)

用SUM() OVER()窗口函数可以轻松实现累计计算,代码简洁高效:

SELECT
    Date,
    Trans,
    Detail,
    Amt,
    Payment,
    -- 按日期排序,累计计算(Amt - Payment)的总和作为余额
    SUM(Amt - Payment) OVER (ORDER BY Date) AS Balance
FROM transactions
ORDER BY Date;

方案2:MySQL 5.x(不支持窗口函数)

用用户变量来模拟累计计算,同样能达到效果:

SELECT
    Date,
    Trans,
    Detail,
    Amt,
    Payment,
    -- 初始化变量@balance为0,逐行累加计算余额
    @balance := @balance + Amt - Payment AS Balance
FROM transactions, (SELECT @balance := 0) AS init_var
ORDER BY Date;

查询结果示例

执行后会得到你需要的格式,正确的计算结果如下(你提供的示例中第三行Balance写的-100应该是笔误,实际逻辑是100+500-400=200):

DateTransDetailAmtPaymentBalance
2018-05-04InvInv_1100.000.00100.00
2018-05-04InvInv_2500.000.00600.00
2018-05-04PaymentInv_1,Inv_20.00400.00200.00
2018-05-06InvInv_2500.000.00700.00
2018-05-06PaymentInv_20.00600.00100.00
2018-05-06creditcredit500.000.00600.00
2018-05-08InvInv_3100.000.00700.00

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 10:57:15