select
case
when age < 25 or age is null then '25岁以下'
else '25岁及以上'
end as age_cut,
count(*) as number
from
user_profile
group by
age_cut
order by
case
when age_cut = '25岁以下' then 1
else 2
end;
代码结构分析
1. 数据分组(CASE WHEN + GROUP BY)
sql
CASE
WHEN age < 25 OR age IS NULL THEN '25岁以下'
ELSE '25岁及以上'
- 作用:将用户按年龄分段。如果 age 小于 25 或 age 为 NULL,标记为 "25 岁以下"。否则(age >= 25),标记为 "25 岁及以上"。
- 注意:
age IS NULL的用户会被归类到 "25 岁以下",需根据业务需求确认是否合理。
2. 统计数量(COUNT(*))
sql
END AS age_cut COUNT(*) AS number
- 作用:统计每个分组的用户数量。COUNT(*) 会统计所有记录(包括 age 为 NULL 的记录)。
3. 分组依据(GROUP BY age_cut)
sql
GROUP BY age_cut
- 作用:根据
age_cut的值(即分段结果)分组,确保统计结果按年龄段分开。
4. 排序(ORDER BY + CASE)
sql
ORDER BY
CASE
WHEN age_cut = '25岁以下' THEN 1
ELSE 2
END
- 作用:自定义排序规则,确保结果按 "25 岁以下" 在前、"25 岁及以上" 在后的顺序展示。通过 CASE 返回数值(1 或 2),实现固定顺序排序。
关键点说明
- 处理 NULL 值:age IS NULL 的用户被归类到 "25 岁以下"。若需单独处理 NULL,可新增一个分组(如 "年龄未知")。
- 分组与排序的一致性:GROUP BY 和 ORDER BY 都使用 age_cut,确保分组和排序逻辑统一。
- 性能优化:若表数据量较大,可在 age 字段上创建索引,加速过滤和分组操作。

京公网安备 11010502036488号