题目描述
有一个员工表 employees 简况如下:
有一个薪水表 salaries 简况如下:
请你查找所有员工自从入职以来的薪水涨幅情况,给出员工编号 emp_no 以及其对应的薪水涨幅 growth,并按照 growth 进行升序,上述示例的查询结果为:
注:可能有 employees 表和 salaries 表里存在记录的员工,有对应的员工编号和涨薪记录,但是已经离职了,离职的员工 salaries 表的最新的 to_date != '9999-01-01'
,这样的数据不显示在查找结果里面。
答案解析
本题的重点是,求出所有在职员工的工资涨幅。所以我们要将表中的信息归结成两点,第一个是获取在职员工,第二个是获取这些在职员工的工资涨幅情况。
题中的注明已经给出,salaries 表中 只要 to_date = '9999-01-01'
的员工就是在职员工。
工资涨幅 = 当前的工资 - 入职时的工资。
所有员工的当前工资:
SELECT emp_no,salary FROM salaries
WHERE to_date = '9999-01-01'
所有员工的入职时工资:
SELECT s.emp_no AS emp_no,s.salary AS salary FROM salaries AS s
INNER JOIN employees AS e
ON s.emp_no = e.emp_no
WHERE e.hire_date = s.from_date
我们可以通过上面查出的两个表关联进行求解,SQL 语句如下:
SELECT current_salaries.emp_no,(current_salaries.salary - hire_salaries.salary) AS growth
FROM
(
-- 查询当前员工的工资
SELECT emp_no,salary FROM salaries
WHERE to_date = '9999-01-01'
)AS current_salaries
LEFT JOIN
(
-- 查询员工入职时的工资
SELECT s.emp_no AS emp_no,s.salary AS salary FROM salaries AS s
INNER JOIN employees AS e
ON s.emp_no = e.emp_no
WHERE e.hire_date = s.from_date
) AS hire_salaries
ON current_salaries.emp_no = hire_salaries.emp_no
ORDER BY growth ASC;