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

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

输入示例(员工工资表 employees),emp_id员工 ID,salary月薪

区间划分规则

输出示例

思路:

① 将连续工资离散化为区间

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

② 按区间聚合统计人数

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

③ 在全量数据上计算总人数

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

④ 计算并格式化占比

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

易错点:

① 区间边界重叠或遗漏​

建议采用 左闭右开(如 < 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)或增加辅助排序字段。

SELECT 
    salary_range,
    COUNT(*) AS emp_count,
    ROUND(COUNT(*) * 100.0 / SUM(COUNT(*)) OVER (), 2) AS percent
FROM (
    SELECT 
        CASE 
            WHEN salary < 5000 THEN '0-4999'
            WHEN salary BETWEEN 5000 AND 9999 THEN '5000-9999'
            WHEN salary BETWEEN 10000 AND 14999 THEN '10000-14999'
            WHEN salary >= 15000 THEN '15000+'
            ELSE '未录入'
        END AS salary_range
    FROM employees
) t
GROUP BY salary_range
ORDER BY salary_range;

全部评论
可以的,写的很好呢
点赞 回复 分享
发布于 04-22 23:42 北京

相关推荐

评论
点赞
1
分享

创作者周榜

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