如何按name分组统计status=1的行数,将其他值及NULL计为0?
解决按name分组统计status=1行数并包含0值的问题
需求明确
按name分组,统计每组中status = 1的记录行数;对于status不等于1(包括0)或为NULL的情况,该组统计结果计为0,且所有出现过的name都必须出现在结果中。
你的问题分析
- WHERE过滤导致丢失分组:用
WHERE status IS NULL OR status=1会直接过滤掉status=0的记录,像Juuso这种所有记录都是status=0的name,会因为没有符合WHERE条件的记录而被排除在分组结果外,不符合需求。 - CASE WHEN与聚合函数搭配错误:你写的
CASE WHEN status IS NULL THEN 0 WHEN status=0 THEN 0 WHEN status=1 THEN COUNT(DISTINCT name)逻辑混乱——COUNT(DISTINCT name)在每个分组里结果都是1(因为已经按name分组),而且聚合函数不能嵌套在CASE WHEN的THEN分支里针对单条记录判断,应该是对每条记录生成1/0标记,再用SUM累加。
正确解决方案
核心是不提前过滤任何记录,按name分组后,用SUM()配合CASE WHEN统计符合条件的行数:
SELECT name, SUM(CASE WHEN status = 1 THEN 1 ELSE 0 END) AS status_1_count FROM students GROUP BY name;
结果验证
基于你提供的测试数据,执行上述SQL会得到以下结果:
| name | status_1_count |
|---|---|
| Uolevi | 2 |
| Maija | 4 |
| Juuso | 0 |
| Miiko | 0 |
- Uolevi:有2条
status=1的记录,统计正确 - Maija:有4条
status=1的记录,统计正确 - Juuso:所有记录
status=0,结果为0 - Miiko:
status为NULL,结果为0
完全符合你的需求。
内容的提问来源于stack exchange,提问作者FC Chelsea
相关产品推荐
相关产品推荐

