题目描述

有一个员工表 employees 简况如下:

查找所有员工自入职以来的薪水涨幅情况 - 图1

有一个薪水表 salaries 简况如下:

查找所有员工自入职以来的薪水涨幅情况 - 图2

请你查找所有员工自从入职以来的薪水涨幅情况,给出员工编号 emp_no 以及其对应的薪水涨幅 growth,并按照 growth 进行升序,上述示例的查询结果为:

查找所有员工自入职以来的薪水涨幅情况 - 图3

注:可能有 employees 表和 salaries 表里存在记录的员工,有对应的员工编号和涨薪记录,但是已经离职了,离职的员工 salaries 表的最新的 to_date != '9999-01-01' ,这样的数据不显示在查找结果里面。

答案解析

本题的重点是,求出所有在职员工的工资涨幅。所以我们要将表中的信息归结成两点,第一个是获取在职员工,第二个是获取这些在职员工的工资涨幅情况。

题中的注明已经给出,salaries 表中 只要 to_date = '9999-01-01' 的员工就是在职员工。

工资涨幅 = 当前的工资 - 入职时的工资。

所有员工的当前工资:

  1. SELECT emp_no,salary FROM salaries
  2. WHERE to_date = '9999-01-01'

所有员工的入职时工资:

  1. SELECT s.emp_no AS emp_no,s.salary AS salary FROM salaries AS s
  2. INNER JOIN employees AS e
  3. ON s.emp_no = e.emp_no
  4. WHERE e.hire_date = s.from_date

我们可以通过上面查出的两个表关联进行求解,SQL 语句如下:

  1. SELECT current_salaries.emp_no,(current_salaries.salary - hire_salaries.salary) AS growth
  2. FROM
  3. (
  4. -- 查询当前员工的工资
  5. SELECT emp_no,salary FROM salaries
  6. WHERE to_date = '9999-01-01'
  7. )AS current_salaries
  8. LEFT JOIN
  9. (
  10. -- 查询员工入职时的工资
  11. SELECT s.emp_no AS emp_no,s.salary AS salary FROM salaries AS s
  12. INNER JOIN employees AS e
  13. ON s.emp_no = e.emp_no
  14. WHERE e.hire_date = s.from_date
  15. ) AS hire_salaries
  16. ON current_salaries.emp_no = hire_salaries.emp_no
  17. ORDER BY growth ASC;