如何编写SQL查询汇总当年与上年交易收支总额?
问题分析与修正
你的需求完全可以实现,原查询的核心问题是聚合逻辑顺序错误,同时缺少必要的分组操作,导致计算结果偏差。
原查询的错误点
- 未使用
GROUP BY account_id,且保留了date、debit、credit这类非聚合字段,不符合"按账户年度汇总"的要求,数据库会返回混乱的聚合结果。 - 聚合函数
SUM()的位置错误:你先对全表的debit/credit做了全局聚合,再用IF判断年份,这会导致所有行都使用同一个全局总和,而非对应年份的分组总和。
修正后的SQL
SELECT account_id, -- 2021年总额:credit总和减去debit总和 SUM(CASE WHEN YEAR(date) = 2021 THEN (credit - debit) ELSE 0 END) AS total_previous, -- 2022年总额:credit总和减去debit总和 SUM(CASE WHEN YEAR(date) = 2022 THEN (credit - debit) ELSE 0 END) AS total_current FROM transaction_lines WHERE account_id = '1021' AND date BETWEEN '2021-01-01' AND '2022-12-31' GROUP BY account_id;
逻辑说明
- 使用
CASE WHEN对每一行先判断所属年份,计算该行的credit - debit(对应预期的正负逻辑),再用SUM()对同一年份的结果累加。 - 通过
GROUP BY account_id确保按账户汇总,得到每个账户的年度总额。 - 用
YEAR(date)简化年份判断,比直接写日期范围更简洁。
执行这个查询后,会得到你预期的结果:
account_id | total_previous | total_current 1021 | -100 | -69
内容的提问来源于stack exchange,提问作者Luqman Ahmad
相关产品推荐
相关产品推荐

