我有一个名为SalaryTable
的表,其中包含各个部门员工的薪水:
dept_id name salary
12 a 100
13 b 200
12 c 300
14 d 400
12 e 500
13 f 600
我需要找到具有给定部门ID的每个部门的最高薪水以及该人的姓名以及最高薪水。
我正在为此使用以下sql查询
select dept_id, name, max(salary)
from SalaryTable
group by salary
但是上面的代码给了我错误:
dept_id must be an aggregate expression or appear in GROUP BY clause
我可以通过以下查询轻松获得下表:
select dept_id, max(salary) as max_salary
from SalaryTable
group by salary
dept_id max_salary
12 500
13 600
14 400
但是我也需要该人的名字,例如:
所需的输出
dept_id name max_salary
12 e 500
13 f 600
14 d 400
答案 0 :(得分:2)
您似乎正在学习SQL,因此可以在已有的基础上继续学习。以下是最高工资:
select dept_id, max(salary)
from SalaryTable
group by dept_id;
您可以将其用作子查询,以获取所有匹配的名称:
select st.*
from SalaryTable st join
(select dept_id, max(salary) as max_salary
from SalaryTable
group by dept_id
) std
on st.dept_id = std.dept_id and
st.salary = std.max_salary
答案 1 :(得分:1)
使用相关子查询
select dept_id, name, salary
from SalaryTable a
where salary =(select max(salary) from SalaryTable b where a.dept_id=b.dept_id)
答案 2 :(得分:0)
确切地说:
SELECT dept_id, NAME, salary FROM SalaryTable a
WHERE salary =(SELECT MAX(salary) FROM SalaryTable b WHERE a.dept_id=b.dept_id)
ORDER BY dept_id;
另请参阅尝试连接,因为请参见this
记住::无论您在select
子句中使用的单个sql语句中位于from
和group by
之间的任何内容(这就是您的错误所说的!)。
答案 3 :(得分:0)
您可以使用“不存在”来做到这一点:
select s.* from SalaryTable s
where not exists (
select 1 from SalaryTable
where dept_id = s.dept_id and salary > s.salary
)
order by s.dept_id
请参见demo。
结果:
> dept_id | name | salary
> ------: | :--- | -----:
> 12 | e | 500
> 13 | f | 600
> 14 | d | 400