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

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 10:19:04