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)或增加辅助排序字段。
思路:
① 将连续工资离散化为区间
使用 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)或增加辅助排序字段。
全部评论
相关推荐
04-16 10:50
北京理工大学 前端开发其它 点赞 评论 收藏
分享
点赞 评论 收藏
分享
查看26道真题和解析 点赞 评论 收藏
分享