本文主要是介绍SQL21查找在职员工自入职以来的薪水涨幅情况,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
文章目录
- 1. 题目
- 2. 题解
- 反思:一个原始字段如何创造出多个字段
题目较难,纳入错题本。
如果思路不正确,就会无从下手。
1. 题目
-
题目来源:查找在职员工自入职以来的薪水涨幅情况
-
题目描述
-
表格
-
所需结果
2. 题解
薪资涨幅 = 当前工资 - 入职工资
当前工资 :to_date = '9999-01-01'
入职工资:hire_date
问题是如何构造出这两个字段(没思路就卡这里了)
分别从两张表中利用这个信息,然后让两张表分别与工资表进行连接,最后正在外表中求取两者差值。
(因为被日期限制死了,所以不需要分组或者DISTINCT进行去重)
简单来说,连接过程就是 (A-B) - (B - C)
,这里B代表salaries
表格,用了两次。
(其实后面用 A-B-C的方式和更加简单,一次JOIN
就增加了一个字段)
完整过程如下:
在这里插入代码片# # 入职工资
# SELECT s.emp_no, s.salary
# FROM salaries s
# JOIN employees e
# ON s.emp_no = e.emp_no AND e.hire_date = s.from_date# # 当前工资
# SELECT s.emp_no, s.salary
# FROM salaries s
# JOIN employees e
# ON s.emp_no = e.emp_no AND s.to_date = '9999-01-01'SELECT min_salary.emp_no, max_salary.salary - min_salary.salary growth
FROM(SELECT s.emp_no, s.salaryFROM salaries sJOIN employees e ON s.emp_no = e.emp_no AND e.hire_date = s.from_date ) min_salary
JOIN (
SELECT s.emp_no, s.salary
FROM salaries s
JOIN employees e
ON s.emp_no = e.emp_no AND s.to_date = '9999-01-01') max_salary
ON min_salary.emp_no = max_salary.emp_no
ORDER BY growth ASC
一种更为简单,也更可取的方法:
直接 使用的 A-B-C
连接方法!
# 方法1:一步到位SELECT e.emp_no, (a.salary - b.salary) AS growth
FROM employees eJOIN salaries a ON e.emp_no = a.emp_no AND a.to_date = '9999-01-01'JOIN salaries b ON e.emp_no = b.emp_no AND b.from_date = e.hire_date
ORDER BY growth ASC;# # 方法2:朴素做法# # 分别构造出 包含 employee 对应 last_salary、employee 对应 first_salary 的这两张表,最后利用employee 进行内连接# SELECT a.emp_no, (a.salary - b.salary) AS growth
# FROM (SELECT e.emp_no, s.salary FROM employees e JOIN salaries s ON e.emp_no = s.emp_no WHERE to_date = '9999-01-01') AS a
# JOIN (SELECT e.emp_no, s.salary FROM employees e JOIN salaries s ON e.emp_no = s.emp_no WHERE from_date = e.hire_date) AS b
# ON a.emp_no = b.emp_no
# ORDER BY growth
注:因为是 INNER JOIN
,所以 a.to_date = '9999-01-01'
和b.from_date = e.hire_date
是可以放在 ON
后面(而不一定需要WHERE
)进行限制的。
反思:一个原始字段如何创造出多个字段
开始思路被阻断在 如何 利用 salary 这个字段创造出两个不同的字段,
毕竟使用行过滤一次也只能找出一个 对应的 salary,可是问题的求解需要 新(当前salary) 、 **旧(初始salary)**两个字段。
解决办法只有一个,多次使用JOIN,使用ON 进行不同的条件限制,就能找出相应的条件下的 salary。
这篇关于SQL21查找在职员工自入职以来的薪水涨幅情况的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!