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

如何编写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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 09:08:54