标准RDBMS中单列多条件求和的SQL实现咨询
用CASE语句实现多条件账单统计
完全可以用CASE语句解决你的需求!这正是处理这类多条件聚合统计的经典方案,比嵌套查询更简洁高效,一次扫表就能完成所有统计。
核心思路
按用户分组,通过CASE配合SUM()函数分别筛选出「已付」和「未付」的账单金额,最后直接计算两者的差额(债务)即可。
完整SQL示例
假设你的表名为user_bills,注意原始数据里的列名date payments包含空格,需要用反引号(不同RDBMS可能用双引号,比如Oracle)包裹:
SELECT user, SUM(CASE WHEN `date payments` IS NOT NULL THEN bills ELSE 0 END) AS `payed bills`, SUM(CASE WHEN `date payments` IS NULL THEN bills ELSE 0 END) AS `unpayed bills`, SUM(CASE WHEN `date payments` IS NULL THEN bills ELSE 0 END) - SUM(CASE WHEN `date payments` IS NOT NULL THEN bills ELSE 0 END) AS debit FROM user_bills GROUP BY user;
代码逐行解释
GROUP BY user:将数据按用户维度分组,保证每个用户只输出一行统计结果- 第一个
SUM(CASE...):仅对有支付日期的账单求和,得到已付账单总额 - 第二个
SUM(CASE...):仅对无支付日期的账单求和,得到未付账单总额 debit字段:直接用未付总额减去已付总额,得到用户当前的债务金额
优化写法(可读性更强)
如果觉得重复写CASE语句繁琐,也可以先计算已付/未付的中间结果,再用别名计算差额(大部分现代RDBMS都支持这种写法):
SELECT user, `payed bills`, `unpayed bills`, `unpayed bills` - `payed bills` AS debit FROM ( SELECT user, SUM(CASE WHEN `date payments` IS NOT NULL THEN bills ELSE 0 END) AS `payed bills`, SUM(CASE WHEN `date payments` IS NULL THEN bills ELSE 0 END) AS `unpayed bills` FROM user_bills GROUP BY user ) AS subquery;
把你提供的示例数据代入这段SQL,会得到完全符合你期望的输出结果。
内容的提问来源于stack exchange,提问作者theantomc
相关产品推荐
相关产品推荐

