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

如何使用两个带不同条件的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 11:41:56