如何使用两个带不同条件的SUM()函数计算用户账户剩余余额?
实现每个用户账户剩余余额查询的两种方法
嘿,这个需求其实很容易搞定,我给你两种常用的SQL写法,你可以根据自己用的数据库选合适的方案:
方法一:用CASE WHEN在聚合函数里区分操作类型
这种写法比较简洁,直接在SUM函数里通过条件判断分别计算存款和取款总额,再做减法:
SELECT userid, SUM(CASE WHEN action = 'Deposit' THEN amount ELSE 0 END) - SUM(CASE WHEN action = 'removal' THEN amount ELSE 0 END) AS remaining_charge FROM Table1 GROUP BY userid;
逻辑说明:
- 每条记录如果是
Deposit操作,就把amount计入存款总和;否则加0 - 如果是
removal操作,就把amount计入取款总和;否则加0 - 最后按
userid分组,用存款总额减去取款总额,得到每个用户的剩余余额
方法二:子查询分别统计存款和取款后关联
要是觉得CASE WHEN的写法不够直观,也可以拆成两个子查询分别计算存款、取款,再通过用户ID关联计算余额:
SELECT d.userid, d.total_deposit - COALESCE(r.total_removal, 0) AS remaining_charge FROM ( -- 统计每个用户的总存款 SELECT userid, SUM(amount) AS total_deposit FROM Table1 WHERE action = 'Deposit' GROUP BY userid ) d LEFT JOIN ( -- 统计每个用户的总取款 SELECT userid, SUM(amount) AS total_removal FROM Table1 WHERE action = 'removal' GROUP BY userid ) r ON d.userid = r.userid;
逻辑说明:
- 子查询
d算出每个用户的存款总额 - 子查询
r算出每个用户的取款总额 - 用
LEFT JOIN保证就算用户没有取款记录也能被查到,COALESCE把空值的取款总额转成0,避免出现NULL结果
这两种方法都能得到你想要的结果:
userid remaining_charge
1 9500
2 7000
内容的提问来源于stack exchange,提问作者iAm.Hassan
相关产品推荐
相关产品推荐

