SQL21查找在职员工自入职以来的薪水涨幅情况

题目较难,纳入错题本。
如果思路不正确,就会无从下手。

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.salary
    FROM salaries s
    JOIN 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 e
    JOIN 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

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值