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

标准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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 21:37:57