获取所有部门中员工薪水最高的相关信息
- 题目
- 题目分析
- 错误答案____max 函数 和select
- listagg 函数的其他用法之后再补充
- 题目补充
题目
有一个员工表dept_emp简况如下:
有一个薪水表salaries简况如下:
获取所有部门中员工薪水最高的相关信息,给出dept_no, emp_no以及其对应的salary,按照部门编号升序排列,以上例子输出如下:
题目分析
- 题目要点:薪水最高(max),升序排列(order by asc)
- 结果需要三条信息,在两个表中——join 关键字
- dept_no在dept_emp表,salary在salaries表中,使用emp_no连接(on)
错误答案____max 函数 和select
select d.dept_no,d.emp_no,max(s.salary)
from dept_emp as d
left join salaries as s
on d.emp_no = s.emp_no
group by dept_no
order by dept_no;
这里3和4号员工是一个部门,但是select 和max 一起用就把 4的工资给了3
这里涉及问题:group by 某字段后,其他字段如何处理
- 对数值可以使用函数:sum、max、min,但是不能保证是同一列的信息,select函数默认取第一行,而max 函数会把最大值拼在第一行
- 对字符串可以使用 listagg函数
listagg 函数的其他用法之后再补充
#将部门合并,展示部门员工编号
select d.dept_no,listagg(d.emp_no)
from dept_emp
group by dept_no;
#这个没有测试
题目补充
如果存在多个最大值,其他的值怎么取到
使用多个select 语句,创建多个过程表
#可能存在多个最大值,会舍弃其他的
SELECT currentsalary.dept_no, currentsalary.emp_no, currentsalary.salary AS salary
FROM
#创建maxsalary表用于存放当前每个部门薪水的最大值
(SELECT d.dept_no, MAX(s.salary) AS salary
FROM salaries AS s INNER JOIN dept_emp As d
ON d.emp_no = s.emp_no
WHERE d.to_date = '9999-01-01' AND s.to_date = '9999-01-01'
GROUP BY d.dept_no) AS maxsalary,
#创建currentsalary表用于存放当前每个部门所有员工的编号和薪水
(SELECT d.dept_no, s.emp_no, s.salary
FROM salaries AS s INNER JOIN dept_emp As d
ON d.emp_no = s.emp_no
WHERE d.to_date = '9999-01-01' AND s.to_date = '9999-01-01'
) AS currentsalary
#限定条件为两表的dept_no和salary均相等
WHERE currentsalary.dept_no = maxsalary.dept_no
AND currentsalary.salary = maxsalary.salary
#最后以currentsalary.dept_no排序输出符合要求的记录表
ORDER BY currentsalary.dept_no