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

MySQL GROUP BY统计保留零值:LeetCode 1907问题求解疑问

关于LeetCode 1907题的SQL解法思路分析

首先明确结论:你用自连接派生表的思路没法实现“保留所有三类账户(含数量为0的类别)”的需求,而且你的代码本身存在两处关键问题:

  • CASE表达式逻辑错误:第二个WHEN条件逻辑矛盾,应该是income >=20000 AND income <=50000,否则这个条件会和第一个income <20000重复,导致中等收入的分类永远无法被正确匹配。
  • 自连接无法生成缺失类别:你的派生表Accounts_category只会包含原表中实际存在的类别,自连接后GROUP BY依然只能统计这些已存在的分组,没法凭空生成原表中没有的类别(比如原表没有高收入用户,结果里就不会出现“High Salary”行)。

正确实现思路

要确保结果包含所有三类,必须先构造一个包含所有目标类别的基础类别表,再左连接原表的分类统计结果,以此补全数量为0的类别。

解法代码示例:

-- 构造包含全部三类的基础表
WITH categories AS (
    SELECT 'Low Salary' AS category UNION ALL
    SELECT 'Average Salary' UNION ALL
    SELECT 'High Salary'
),
-- 统计原表中各类别的实际数量
account_stats AS (
    SELECT 
        CASE 
            WHEN income < 20000 THEN 'Low Salary'
            WHEN income BETWEEN 20000 AND 50000 THEN 'Average Salary'
            ELSE 'High Salary'
        END AS category,
        COUNT(*) AS accounts_count
    FROM Accounts
    GROUP BY category
)
-- 左连接基础表与统计结果,用COALESCE将NULL转为0
SELECT 
    c.category,
    COALESCE(a.accounts_count, 0) AS accounts_count
FROM categories c
LEFT JOIN account_stats a ON c.category = a.category;

为什么你的思路不可行?

自连接的本质还是基于原表的数据行,原表中不存在的类别在派生表里也不会出现,GROUP BY只能对已有的分组统计,无法生成新分组。而先构造基础类别表的方式,相当于提前定义好所有必须出现的分组,再通过左连接关联实际统计结果,缺失的分组就会被补全为0,完全符合题目要求。

内容的提问来源于stack exchange,提问作者Mia Suen

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 11:00:08