如何编写PostgreSQL SQL查询计算各账户余额?
解决PostgreSQL中按账户计算余额的问题
嗨,这事儿好办!要计算每个账户的贷方总和减借方总和的余额,核心就是用条件聚合来分别统计不同交易类型的金额,再按账户分组就行。我给你两种常用的写法,都能搞定:
方法一:使用CASE WHEN语句
这是SQL标准语法,所有数据库都支持,兼容性拉满:
SELECT account_id, -- 统计贷方总金额 SUM(CASE WHEN transaction_type = 'credit' THEN amount ELSE 0 END) AS total_credit, -- 统计借方总金额 SUM(CASE WHEN transaction_type = 'debit' THEN amount ELSE 0 END) AS total_debit, -- 直接计算余额:贷方总和 - 借方总和 SUM(CASE WHEN transaction_type = 'credit' THEN amount ELSE -amount END) AS account_balance FROM transactions -- 这里替换成你的交易表名 GROUP BY account_id;
原理很简单:CASE WHEN会逐个判断每条交易的类型,符合条件就取对应的amount,不符合就取0(或者在余额计算里取负的amount),最后用SUM聚合起来,再按account_id分组,就得到每个账户的明细和余额了。
方法二:使用PostgreSQL专属的FILTER子句
PostgreSQL支持更直观的FILTER语法,可读性更强,写起来更简洁:
SELECT account_id, SUM(amount) FILTER (WHERE transaction_type = 'credit') AS total_credit, SUM(amount) FILTER (WHERE transaction_type = 'debit') AS total_debit, -- 计算余额,用COALESCE处理可能的NULL(比如账户只有借方/贷方时) COALESCE(SUM(amount) FILTER (WHERE transaction_type = 'credit'), 0) - COALESCE(SUM(amount) FILTER (WHERE transaction_type = 'debit'), 0) AS account_balance FROM transactions GROUP BY account_id;
这里加了COALESCE是为了避免如果某个账户只有借方或者只有贷方时,SUM返回NULL导致余额也变成NULL的情况,用COALESCE把NULL转换成0就完美解决了。
你可以根据自己的习惯选其中一种写法,测试一下应该就能得到你想要的结果啦!
内容的提问来源于stack exchange,提问作者Otto
相关产品推荐
相关产品推荐

