【问题标题】:How to select highest paid employee in dept based on the following? [closed]如何根据以下情况选择部门薪酬最高的员工? [关闭]
【发布时间】:2013-09-21 15:15:09
【问题描述】:

我有一张这样的桌子:

员工

EmpID | EmpName |EmpSalary | DEpartment

然后是另一个表

奖金

EmpID |EmpBonus

如何获得每个部门的最高薪员工,包括他们的奖金?

【问题讨论】:

  • 一个示例记录和一个示例查询也应该与13k 用户的问题一起发布。
  • 你使用的是什么 rdbms?

标签: sql


【解决方案1】:

如果您使用的是 SQL-Server,请使用 ROW_NUMBERDENSE_RANK(如果您想包含关联):

WITH CTE AS(
    SELECT e.EmpID,e.EmpName,e.EmpSalary, e.Department,b.EmpBonus,
       RN = ROW_NUMBER() OVER (PARTITION BY Department 
                               ORDER BY (EmpSalary + COALESCE(EmpBonus,0)) DESC)
    FROM Employees e LEFT OUTER JOIN Bonuses b
       ON e.EmpID = b.EmpID 
)
SELECT EmpID, EmpName, EmpSalary, Department, EmpBonus
FROM CTE
WHERE RN = 1

Ranking Functions

【讨论】:

  • 你应该在这里使用LEFT JOIN,有可能员工的薪水最高但没有奖金。
  • @491243 一个员工甚至可能有超过 1 个奖金(OP 也没有声明 EmpIDBonuses 表中的主键)但是这个答案涵盖了到目前为止所问的内容. +1
  • @491243:相应地编辑了我的答案。感谢您的来信。
  • @ypercube 我也同意这个答案。但希望 OP 的 rdbms 支持窗口功能。 +1 :)
【解决方案2】:

在 SQL Server 中

SELECT top 1 e.EmpID,e.EmpName,e.Department,
sum(EmpSalary + EmpBonus) as total_salary
FROM Employees e INNER JOIN Bonuses b
ON e.EmpID = b.EmpID 
group by e.EmpID,e.EmpName,e.Department
order by total_salary desc

在 MySQL 中

SELECT e.EmpID,e.EmpName,e.Department,
sum(EmpSalary + EmpBonus) as total_salary
FROM Employees e INNER JOIN Bonuses b
ON e.EmpID = b.EmpID 
group by e.EmpID,e.EmpName,e.Department
order by total_salary desc limit 1

【讨论】:

    【解决方案3】:

    试试这个:

    select EmpID (EmpSalary+EmpBonus) as total_salary
    from Employees e LEFT JOIN Bonuses b
    order by total_salary desc
    limit 1
    

    我不知道您使用的是哪个 SGBD,因此限制 1 可能是错误的。按照你的情况去做。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-07-02
      • 1970-01-01
      • 2021-01-03
      • 2015-11-20
      • 2021-07-19
      • 2013-05-23
      • 1970-01-01
      相关资源
      最近更新 更多