【SQL练习】员工薪资占比与部门排名查询

有一个员工薪资表,包括员工姓名、所属部门、薪资 3列,求以下指标:
1、求出每个员工占所在部门整体薪资的占比;
2、求出每个部门Top3 工资排名的员工; 写出Oracle SQL

以下是针对您需求的Oracle SQL语句:

表结构假设

-- 假设表名为 employee_salary
-- 包含列:emp_name(员工姓名), dept_name(部门名称), salary(薪资)

1. 每个员工占所在部门整体薪资的占比

SELECT 
    emp_name,
    dept_name,
    salary,
    ROUND(salary / SUM(salary) OVER (PARTITION BY dept_name) * 100, 2) AS salary_ratio_percent
FROM 
    employee_salary
ORDER BY 
    dept_name, salary_ratio_percent DESC;

2. 每个部门Top3工资排名的员工

方法一:使用ROW_NUMBER()(不包含并列情况)

SELECT 
    emp_name,
    dept_name,
    salary,
    salary_rank
FROM (
    SELECT 
        emp_name,
        dept_name,
        salary,
        ROW_NUMBER() OVER (PARTITION BY dept_name ORDER BY salary DESC) AS salary_rank
    FROM 
        employee_salary
)
WHERE 
    salary_rank <= 3
ORDER BY 
    dept_name, salary_rank;

方法二:使用DENSE_RANK()(包含并列情况)

SELECT 
    emp_name,
    dept_name,
    salary,
    salary_rank
FROM (
    SELECT 
        emp_name,
        dept_name,
        salary,
        DENSE_RANK() OVER (PARTITION BY dept_name ORDER BY salary DESC) AS salary_rank
    FROM 
        employee_salary
)
WHERE 
    salary_rank <= 3
ORDER BY 
    dept_name, salary_rank;

3. 综合查询:同时显示占比和排名

SELECT 
    emp_name,
    dept_name,
    salary,
    ROUND(salary / SUM(salary) OVER (PARTITION BY dept_name) * 100, 2) AS salary_ratio_percent,
    DENSE_RANK() OVER (PARTITION BY dept_name ORDER BY salary DESC) AS dept_salary_rank
FROM 
    employee_salary
ORDER BY 
    dept_name, dept_salary_rank;

4. 只显示各部门Top3员工的薪资占比

SELECT 
    emp_name,
    dept_name,
    salary,
    ROUND(salary / dept_total_salary * 100, 2) AS salary_ratio_percent,
    salary_rank
FROM (
    SELECT 
        emp_name,
        dept_name,
        salary,
        SUM(salary) OVER (PARTITION BY dept_name) AS dept_total_salary,
        DENSE_RANK() OVER (PARTITION BY dept_name ORDER BY salary DESC) AS salary_rank
    FROM 
        employee_salary
)
WHERE 
    salary_rank <= 3
ORDER BY 
    dept_name, salary_rank;

关键函数说明:

  • ROW_NUMBER(): 为每一行分配唯一的序号,相同薪资也会有不同的排名
  • DENSE_RANK(): 相同薪资获得相同排名,且排名连续不跳跃
  • SUM() OVER (PARTITION BY): 计算每个部门的薪资总和
  • ROUND(): 对百分比结果进行四舍五入,保留2位小数

根据您的具体需求选择合适的查询方法。如果希望处理并列排名的情况,建议使用DENSE_RANK()函数。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值