有一个员工薪资表,包括员工姓名、所属部门、薪资 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()函数。
1192

被折叠的 条评论
为什么被折叠?



