查询员工的薪水涨幅情况

一、问题:

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

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 comment ‘入职时间’,
PRIMARY KEY (emp_no));

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

CREATE TABLE salaries (
emp_no int(11) NOT NULL,
salary int(11) NOT NULL,
from_date date NOT NULL comment ‘一条薪水记录开始时间’,
to_date date NOT NULL comment ‘一条薪水记录结束时间’,
PRIMARY KEY (emp_no,from_date));

查找所有员工自入职以来的薪水涨幅情况,给出员工编号emp_no以及其对应的薪水涨幅growth,并按照growth进行升序排列。
(注意:可能有employees表和salaries表里存在记录的员工,有对应的员工编号和涨薪记录,但是已经离职了,离职的员工salaries表的最新的to_date!=‘9999-01-01’,这样的数据不显示在查找结果里面)。

二、解决:

   1、一开始走了个误区,想着以员工编号分组,利用聚合函数取出当前员工最高最低的薪水,然后过滤掉 差值为0和已经离职的。

-- 查询语句
selelct emp_no, salary as growth 
from (
    select emp_no,(max(salary)-min(salary) as growth,max(to_date) as date
    from salaries  group by emp_no   having  growth <> 0 and   date ='9999-01-01'         
                  )

但是却编译不通过,聚合函数不是这么用的,试了几种分组的组合都不对,有点着急了,就没接着做。等我在闲下来以及好几个小时了,换了个思路在写,渐渐的有眉目了,

2、可以先查入职后的薪水(筛除离职的),再查入职时的薪水(可以根据员工表筛选出入职时的薪水),然后相减。最终sql如下:

-- 查询语句
select a.emp_no, (a.salary - b.salary) as growth 
from (
    select emp_no,salary from salaries where to_date ='9999-01-01'         
 )a inner join (
    select c.emp_no,d.salary from employees c 
    left join salaries d on c.emp_no = d.emp_no where  c.hire_date = d.from_date
 )b  on a.emp_no = b.emp_no
 order by growth 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值