题目:
有一个员工表dept_emp简况如下:
emp_no | dept_no | from_date | to_date |
10001 | d001 | 1986-06-26 | 9999-01-01 |
10002 | d001 | 1996-08-03 | 9999-01-01 |
10003 | d002 | 1996-08-03 | 9999-01-01 |
有一个薪水表salaries简况如下:
emp_no | salary | from_date | to_date |
10001 | 88958 | 2002-06-22 | 9999-01-01 |
10002 | 72527 | 2001-08-02 | 9999-01-01 |
10003 | 92527 | 2001-08-02 | 9999-01-01 |
获取每个部门中当前员工薪水最高的相关信息,给出dept_no, emp_no以及其对应的salary,按照部门编号dept_no升序排列,以上例子输出如下:
dept_no | emp_no | maxSalary |
d001 | 10001 | 88958 |
d002 | 10003 | 92527 |
题解:
因为聚合函数通过作用一组值而只返回一个单一值,因此,在SELECT语句中出现的字段要么为一个聚合函数的输入值,如COUNT(course),要么为GROUP BY语句中指定的字段,要么是常数,否则会出错。
简而言之:使用GROUP BY子句时,SELECT子句中只能有聚合键、聚合函数、常数。
可参考:
GROUP BY语句与HAVING语句的使用 – G先生 – 博客园
解法利用group by和max函数得到含dept_no和max(salary)的表,和其他两表结合
select r.dept_no,ss.emp_no,r.maxSalary
from (
select d.dept_no, max(s.salary) as maxSalary
from dept_emp d, salaries s
where d.emp_no = s.emp_no
and d.to_date='9999-01-01'
and s.to_date='9999-01-01'
group by d.dept_no
) r, dept_emp dd, salaries ss
where
dd.dept_no = r.dept_no
and ss.salary = r.maxSalary
and dd.emp_no = ss.emp_no
and ss.to_date='9999-01-01'
and dd.to_date='9999-01-01'
order by r.dept_no asc
版权声明:本文为weixin_43955488原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。