SQL不同工资区间员工数占比

题目:求不同工资区间员工数占比

思路:
① 将连续工资离散化为区间  
使用 CASE WHEN 对 salary 进行分段,把每一个员工的工资映射到对应的区间标签(如 0-4999、5000-9999),解决“不同区间”的问题。

② 按区间聚合统计人数  
以 salary_range 作为分组维度,用 COUNT(*) 统计每个区间内的员工数量,得到“区间内人数”。

③ 在全量数据上计算总人数  
使用窗口函数 SUM(COUNT(*)) OVER (),在不改变行数的前提下,一次性算出公司总人数,避免额外的子查询或表连接。

④ 计算并格式化占比  
用 区间人数 / 总人数 * 100.0 得出百分比,并通过 ROUND() 保留两位小数,最终产出“各区间人数及其占比”。

易错点:
① 区间边界重叠或遗漏​
使用 CASE WHEN时,若写成 salary <= 5000和 salary >= 5000,会导致 5000 元同时落入两个区间;若漏写 ELSE,部分数据会被 静默忽略。
✅ 建议采用 左闭右开(如 < 5000, >= 5000 AND < 10000)并显式处理 ELSE '其他'。

② NULL 值导致统计失真​
工资字段为 NULL的员工不会参与聚合,导致 分母(总人数)偏小。
✅ 务必使用 WHERE salary IS NOT NULL或在 CASE中定义 '未录入'分支。

③ 整数除法导致结果为 0​
直接写 COUNT(*) * 100 / SUM(...)在严格模式会因整数相除,导致 所有占比都变成 0。
✅ 转为浮点数:COUNT(*) * 100.0 / SUM(...)。

④ 窗口函数分区范围错误​
误写 SUM(...) OVER (PARTITION BY dept_id),会把 部门内占比​ 当成 全公司占比。
✅ 全量占比必须使用 OVER ()(无分区)。

⑤ 字符串排序导致区间乱序​
按 salary_range字符串排序,会出现 10000+排在 0-4999前面的逻辑混乱。
✅ 应按数值排序:ORDER BY MIN(salary)或增加辅助排序字段。
全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务