每个部门的最高薪水

Qin*_*tor 22 sql t-sql sql-server

我有一张桌子EmpDetails:

DeptID      EmpName   Salary
Engg        Sam       1000
Engg        Smith     2000
HR          Denis     1500
HR          Danny     3000
IT          David     2000
IT          John      3000
Run Code Online (Sandbox Code Playgroud)

我需要进行查询,找出每个部门的最高薪水.

AVe*_*Vee 32

简短的问题:

SELECT DeptID, MAX(Salary) FROM EmpDetails GROUP BY DeptID
Run Code Online (Sandbox Code Playgroud)

  • 这里的缺点是它没有指定谁有MAX(薪水)什么是MAX(薪水)[见Joe的回答].但如果这就是所需要的,这几乎是你能得到的最好的:) (10认同)

Joe*_*lli 21

假设SQL Server 2005+

WITH cteRowNum AS (
    SELECT DeptID, EmpName, Salary,
           DENSE_RANK() OVER(PARTITION BY DeptID ORDER BY Salary DESC) AS RowNum
        FROM EmpDetails
)
SELECT DeptID, EmpName, Salary
    FROM cteRowNum
    WHERE RowNum = 1;
Run Code Online (Sandbox Code Playgroud)

  • @Dems我从来没有故意的意思.:-)自从你提出来之后,我将澄清这里使用DENSE_RANK()来允许多个员工在每个部门内拥有最高薪水的可能性. (2认同)

Ank*_*rma 9

如果你也想显示其他参数DeptIdSalary喜欢EmpNameEmpId

SELECT 
        EmpID 
      , Name, 
      , Salary
      , DeptId 
   FROM Employee 
   where 
     (DeptId,Salary) 
     in 
     (select DeptId, max(salary) from Employee group by DeptId)
Run Code Online (Sandbox Code Playgroud)


小智 6

SELECT empName,empDept,EmpSalary
FROM Employee
WHERE empSalary IN
  (SELECT max(empSalary) AS salary
   From Employee
   GROUP BY EmpDept)
Run Code Online (Sandbox Code Playgroud)

  • 如果匹配其他员工的工资记录,这不会搞砸吗?例如,IN 子句有 ('20', '30') 分别用于部门 A 和 B。现在如果 B 部门有员工工资为 20,它会显示那个结果,对吧? (8认同)

vij*_*ani 5

如果部门、工资和员工姓名在同一个表中,则此方法有效。

select ed.emp_name, ed.salary, ed.dept from
(select max(salary) maxSal, dept from emp_dept group by dept) maxsaldept
inner join emp_dept ed
on ed.dept = maxsaldept.dept and ed.salary = maxsaldept.maxSal
Run Code Online (Sandbox Code Playgroud)

还有比这更好的解决方案吗?


小智 5

Select empname,empid,Sal,DeptName from 
(Select e.empname,e.empid,Max(S.Salary) Sal,D.DeptName, ROW_NUMBER() Over(partition by D.DeptName order by s.salary desc) Rownum
from emp e inner join Sal S
on e.empid=s.empid 
inner join Dept d on e.Deptid=d.Deptid
group by e.empname,e.empid,D.DeptName,s.Salary
) x where Rownum = 1
Run Code Online (Sandbox Code Playgroud)