如何找到特定部门员工的最高工资

时间:2019-06-19 11:05:55

标签: sql group-by max

我有一个名为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

4 个答案:

答案 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语句中位于fromgroup 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