题解 | #获取所有员工当前的manager#

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

http://www.nowcoder.com/practice/fc7344ece7294b9e98401826b94c6ea5

错误方法示范:

SELECT emp_no , max(salary)-min(salary) as growth from salaries

where emp_no in

(

SELECT emp_no from salaries where to_date = "9999-01-01"

)

GROUP BY emp_no

ORDER BY growth asc

也就是这个错误,发现我的结果高于 期望结果,

图片说明

该方法没有考虑某一个员工中途或最后被扣工资后比刚入职的时候还低的情况,

错误地以为用max(salary) -min(salary)就是该员工从入职到离职的工资涨幅情况

比如:该员工第1年入职时,工资为10000,

  第2年被罚钱,工资为0,

  第3年又涨钱,工资为20000

  第4年又罚钱,工资为12000

  其工资涨幅应该是12000 - 10000 = 2000,而不是20000 - 0 = 20000

员工工资涨幅情况是从最后一次工资记录到入职时的工资差!!!

正确方法示范:

方法一:on为条件语句,所以s1.salary为最后一次的工资记录,s2.salary 为入职时工资

select e.emp_no, (s1.salary - s2.salary) as growth
from
employees as e
inner join salaries as s1
on e.emp_no = s1.emp_no and s1.to_date = '9999-01-01'
inner join salaries as s2
on e.emp_no = s2.emp_no and e.hire_date = s2.from_date
order by growth asc

MySQL 中 on与where筛选条件的区别
在两张表连接的时候才会有on的筛选条件,那么on和where的区别是什么呢?

在inner join中是没有区别的,但是在左连接和右连接中,区别就体现出来了,下面以左连接(left join)为例:

1、用on的时候,只对右表做筛选条件,而左表不受控制

2、用where的时候,对临时表的组合后的结果进行筛选,所以对左右表都是有作用的。

全部评论

相关推荐

点赞 评论 收藏
分享
4 收藏 评论
分享
牛客网
牛客企业服务