SQL_215
查找在职员工自入职以来的薪水涨幅情况
https://www.nowcoder.com/practice/fc7344ece7294b9e98401826b94c6ea5
方法一:
思路:
这题不是单纯求工资的最大值减最小值。 而是员工当前薪资减去入职时的薪资。
①先创建两个子查询,分别找出所有员工当前的薪水(如子查询 a)和所有员工入职时的薪水(如子查询 b)
②a,b 子查询运用的方法都是一样的,联结 employees 表和 salaries 表,左联结内联结都可以,子查询 a 限定条件直接为当前时间 '9999-01-01',子查询 b 限定条件为入职时间,每个员工入职时间不一样,所以要使用谓词 in 找出在工资表里所有员工对应的最小时间。最后 a,b 子查询都要对员工编号进行分组。
③最后将这两个子查询联结,联结条件为 a.emp_no = b.emp_no,再按照题目要求对薪水涨幅进行升序排序。
代码:
SELECT a.emp_no, (a.salary - b.salary) AS growth FROM ( SELECT e.emp_no, max(s.salary) salary FROM employees e LEFT JOIN salaries s ON e.emp_no = s.emp_no WHERE s.to_date = '9999-01-01' GROUP BY s.emp_no ) a, ( SELECT e.emp_no, min(s.salary) salary FROM employees e LEFT JOIN salaries s ON e.emp_no = s.emp_no WHERE s.to_date IN ( SELECT min(to_date) FROM salaries s GROUP BY s.emp_no ) GROUP BY s.emp_no ) b WHERE a.emp_no = b.emp_no ORDER BY growth ASC;
方法二:
思路:
思路也是先查找如入职的工资,和当前在职工资,求差值即可。 但是这里只用了 salaries 这一张表
代码:
select a.emp_no, (a.salary - b.salary) growth from ( select emp_no, salary from salaries where to_date = '9999-01-01' ) a, ( select emp_no, salary from salaries where to_date in ( select min(to_date) from salaries group by emp_no ) ) b where a.emp_no = b.emp_no order by growth