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 字段上创建索引,加速过滤和分组操作。