如何用SQL按合并年龄分组计算人员占比?
完善后的SQL查询方案
你已经搭好了年龄分组的核心逻辑,只需要补充总数计算来得到占比,这里给你两种实现方式,适配不同的数据库场景:
方式一:使用窗口函数(推荐,简洁高效)
窗口函数可以直接在查询中获取全表总人数,不用额外嵌套子查询,适合支持窗口函数的数据库(比如PostgreSQL、MySQL 8.0+、SQL Server等):
SELECT COUNT(*) AS Count, CASE WHEN age >= 50 THEN '50 and older' WHEN age >= 35 THEN '35 to 49' -- 已经排除了>=50的记录,无需重复判断age <50 ELSE 'Under 35' END AS AgeCat, ROUND(COUNT(*) * 1.0 / COUNT(*) OVER(), 2) AS percent FROM person GROUP BY AgeCat ORDER BY -- 按年龄分组的逻辑顺序排序,避免字符串排序导致顺序混乱 CASE AgeCat WHEN 'Under 35' THEN 1 WHEN '35 to 49' THEN 2 WHEN '50 and older' THEN 3 END;
方式二:子查询获取总数(兼容老版本数据库)
如果你的数据库不支持窗口函数(比如MySQL 5.x及以下),可以用子查询先拿到全表总人数:
SELECT COUNT(*) AS Count, CASE WHEN age >= 50 THEN '50 and older' WHEN age >= 35 THEN '35 to 49' ELSE 'Under 35' END AS AgeCat, ROUND(COUNT(*) * 1.0 / (SELECT COUNT(*) FROM person), 2) AS percent FROM person GROUP BY AgeCat ORDER BY CASE AgeCat WHEN 'Under 35' THEN 1 WHEN '35 to 49' THEN 2 WHEN '50 and older' THEN 3 END;
关键细节说明:
- 简化CASE条件:第一个WHEN已经筛选出
age >=50的记录,第二个WHEN只需要判断age >=35即可,减少冗余逻辑。 - 避免整数除法:乘以
1.0是为了把整数转换为浮点数,确保计算占比时得到小数结果(比如300/1000会得到0.3而不是0)。 - 有序输出:添加自定义排序逻辑,保证分组按年龄从小到大排列,不会因为字符串排序(比如"50..."在"Under..."前面)导致顺序不符合预期。
内容的提问来源于stack exchange,提问作者yshikai
相关产品推荐
相关产品推荐

