方法一:
思路:
这题不是单纯求工资的最大值减最小值。 而是员工当前薪资减去入职时的薪资。
①先创建两个子查询,分别找出所有员工当前的薪水(如子查询 a)和所有员工入职时的薪水(如子查询 b)
②a,b 子查询运用的方法都是一样的,联结 employees 表和 salaries 表,左联结内联结都可以,子查询 a 限定条件直接为当前时间 '9999-01-01',子查询 b 限定条件为入职时间,每个员工入职时间不一样,所以要使用谓词 in 找出在工资表里所有员工对应的最小时间。最后 a,b 子查询都要对员工编号进行分组。
③最后将这两个子查询联结,联结条件为 a.emp_no = b.emp_no,再按照题目要求对薪水涨幅进行升序排序。
代码:
SELECT
a.emp_no,
(a.salary - b.salary) AS growth
FROM
(
SELECT
e.emp_no,
max(s.salary) salary
FROM
employees e
LEFT JOIN salaries s ON e.emp_no = s.emp_no
WHERE
s.to_date = '9999-01-01'
GROUP BY
s.emp_no
) a,
(
SELECT
e.emp_no,
min(s.salary) salary
FROM
employees e
LEFT JOIN salaries s ON e.emp_no = s.emp_no
WHERE
s.to_date IN (
SELECT
min(to_date)
FROM
salaries s
GROUP BY
s.emp_no
)
GROUP BY
s.emp_no
) b
WHERE
a.emp_no = b.emp_no
ORDER BY
growth ASC;
方法二:
思路:
思路也是先查找如入职的工资,和当前在职工资,求差值即可。 但是这里只用了 salaries 这一张表
代码:
select
a.emp_no,
(a.salary - b.salary) growth
from
(
select
emp_no,
salary
from
salaries
where
to_date = '9999-01-01'
) a,
(
select
emp_no,
salary
from
salaries
where
to_date in (
select
min(to_date)
from
salaries
group by
emp_no
)
) b
where
a.emp_no = b.emp_no
order by
growth



京公网安备 11010502036488号