SQL语句解决各部门工资最高员工问题

部门工资最高的员工
Employee 表包含所有员工信息,每个员工有其对应的 Id, salary 和 department Id。
在这里插入图片描述
Department 表包含公司所有部门的信息。
在这里插入图片描述
编写一个 SQL 查询,找出每个部门工资最高的员工。例如,根据上述给定的表格,Max 在 IT 部门有最高工资,Henry 在 Sales 部门有最高工资。
在这里插入图片描述
基本思路:

1)首先在employee表中查询出各部门的最高工资,得到tmp表,它包含部门id和最高工资

2)连立employee表与tmp表,查询出工资在所在部门最高的员工姓名、部门id和最高工资,得到tmp2表。

3)连接department表与 tmp2表,查询出部门id对应的部门名称

第二步是问题的关键,这里的过滤条件是:

1)员工要属于对应部门,所以连接条件是部门id相等;

2)员工的工资在对应的部门中是最高的,所以查询条件是e.salary = t.max_salary

完整的sql语句如下:
select d.name as Department,j.name as Employee ,max_salary as Salary from
department d join
(select e.name,t.did,t.max_salary from #tmp2表
employee e join
(select departmentid as did,max(salary) as max_salary from employee group by departmentid) t #tmp1表
on e.departmentid = t.did
where e.salary = t.max_salary
) j
on d.id = j.did;

部门工资前三高的所有员工

employee表与department表的结构和上例是一样的。

编写一个 SQL 查询,找出每个部门获得前三高工资的所有员工。例如,根据上述给定的表,查询结果应返回:
在这里插入图片描述
思路:
IT 部门中,Max 获得了最高的工资,Randy 和 Joe 都拿到了第二高的工资,Will 的工资排第三。销售部门(Sales)只有两名员工,Henry 的工资最高,Sam 的工资排第二。
注意:这里如果有两个员工处于相同的部门拿到相同的工资且都在前三,是要一并查询出来而且它们只占用一个排名。
基本思路:
1)查询出这样的员工:处于同一个部门且工资比他高的员工人数不超过3(不能为3),查询出它的姓名,工资,部门id,得到tmp表;
2)联立tmp与deparment表,查询出部门的名称。
sql语句如下:
select d.name as Department,t.name as Employee,t.Salary as Salary from
department d join
(select name,salary,departmentid from employee e1 where 3 > #“人数”不超过3,这里用了count(distinct(salary)),从而保证了所有相同工资的员工只会占用一个排名
(select count(distinct(salary)) from employee e2
where e1.departmentid = e2.departmentid #处于同一个部门
and e1.salary < e2.salary)) #工资少于目标员工
on d.id = t.departmentid
order by Department,Salary desc;

猜你喜欢

转载自blog.csdn.net/Dreamy_zsy/article/details/105501181