基于给定交易数据编写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):
| Date | Trans | Detail | Amt | Payment | Balance |
|---|---|---|---|---|---|
| 2018-05-04 | Inv | Inv_1 | 100.00 | 0.00 | 100.00 |
| 2018-05-04 | Inv | Inv_2 | 500.00 | 0.00 | 600.00 |
| 2018-05-04 | Payment | Inv_1,Inv_2 | 0.00 | 400.00 | 200.00 |
| 2018-05-06 | Inv | Inv_2 | 500.00 | 0.00 | 700.00 |
| 2018-05-06 | Payment | Inv_2 | 0.00 | 600.00 | 100.00 |
| 2018-05-06 | credit | credit | 500.00 | 0.00 | 600.00 |
| 2018-05-08 | Inv | Inv_3 | 100.00 | 0.00 | 700.00 |
内容的提问来源于stack exchange,提问作者user2302158
相关产品推荐
相关产品推荐

