牛客网sql6解析--查找所有员工入职时候的薪水情况,给出emp_no以及salary, 并按照emp_no进行逆序

题目:查找所有员工入职时候的薪水情况,给出emp_no以及salary, 并按照emp_no进行逆序(请注意,一个员工可能有多次涨薪的情况)
CREATE TABLE employees (
emp_no int(11) NOT NULL,
birth_date date NOT NULL,
first_name varchar(14) NOT NULL,
last_name varchar(16) NOT NULL,
gender char(1) NOT NULL,
hire_date date NOT NULL,
PRIMARY KEY (emp_no));
CREATE TABLE salaries (
emp_no int(11) NOT NULL,
salary int(11) NOT NULL,
from_date date NOT NULL,
to_date date NOT NULL,
PRIMARY KEY (emp_no,from_date));
分析:题目的最主要目的就是查出员工入职的时候的薪水情况,问题在哪呢,问题在于一个员工会有多次涨薪的情况。我们画出这两张表,比较下
employees表

emp_nobirth_datefirst_namelast_namegenderhire_date
0019999-09-09bigdog11998-01-10
………………………………

我们思考下这张表的情况,这张表的emp_no应该是没有重复的,因为上面这些信息都不会重复,这几个字段没有重复的意义。
salaries表

emp_nosalaryfrom_dateto_date
00120001998-01-101998-12-31
00150001998-12-311999-07-31
00210001996-12-311997-07-31
……………………

这张salaries会展现出涨薪的情况,就是这个人在from_date到to_date这段时间的salary是多少,所以如果我们需要找出这个人的入职时间,其实就是找出他的最小入职时间,sql语句应该是

select min(from_date),salary,emp_no from salaries group by emp_no

这样我们会形成一个表,这个表显示的就是salaries表的每个人的入职的时候的工资。不包含他涨薪的情况。我们拿到这样一张表后,使用employees表进行左连接就行了。注意,在这个新表中是没有hire_date的,第一次入职的from_date就是hire_date。
答案如下:

select e.emp_no,new_s.salary from employees e 
left join (select min(from_date),salary,emp_no from salaries group by emp_no) new_s on 
e.emp_no = new_s.emp_no order by e.emp_no desc;

结果为:
在这里插入图片描述
后记:这个题提交了27次才通过,我自己都无语,给我的感觉就是一定要画出表,然后对表进行分析,不然空想很容易想错。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值