【问题标题】:Group by clause to get name of highest paid employee按条款分组以获取最高薪员工的姓名
【发布时间】:2013-03-21 05:03:10
【问题描述】:

我有一个 Employee 表,其中包含字段 dept、员工和薪水。我想要一个查询来列出部门明智的最高薪水和具有该薪水的员工的姓名。

我知道这很简单。我用谷歌搜索但找到了这样的答案,其中只列出了部门和薪水

SELECT dept, SUM (salary)
FROM employee
GROUP BY dept; 

【问题讨论】:

  • 你在用什么RDBMSRDBMS 代表关系数据库管理系统RDBMS is the basis for SQL,适用于所有现代数据库系统,如 MS SQL Server、IBM DB2、Oracle、MySQL 等...
  • ORDER BYLIMIT。并非您需要的每一段代码都来自 Google。有时你需要为自己考虑。有时你需要学习。

标签: sql sql-server tsql


【解决方案1】:
SELECT e1.*
FROM employee e1
JOIN (SELECT dept, MAX(salary) FROM employee GROUP BY dept) e2 ON
    e1.dept = e2.dept AND e1.salary = e2.salary

【讨论】:

  • 我收到此错误,如何纠正?没有为“e2”的第 2 列指定列名。
  • 您使用的是什么数据库? MSSQL、Postgres、MySQL、...?
【解决方案2】:

SQL Server 2008 支持Window Functions,可帮助您获得所需。

WITH recordList
AS
(
    SELECT  dept, employeeName, salary,
            DENSE_RANK() OVER (PARTITION BY dept ORDER BY salary DESC) rn
    FROM    employee
)
SELECT dept, employeeName, salary
FROM   recordList
WHERE  rn = 1

【讨论】:

  • 如果两个员工的薪水相同(最高),则返回重复行
  • @slacker 因为在查询中我使用了DENSE_RANK(),它认为这是有道理的,因为其中两名员工的薪水相同,而这反过来又是部门中最高的,如果你只是想得到一个你需要使用ROW_NUMBER() ex sqlfiddle.com/#!3/409d1/9
  • @slacker:嗯,应该是这样,因为可能有两名员工的薪水最高。 J W 的回答在逻辑上是对的。
  • 或者您可以使用STUFF 来聚合以逗号分隔的名称,并为每个部门显示在一行中。
【解决方案3】:
  SELECT e.*, d.deptname
    FROM employee e
    JOIN department d ON e.deptid = d.deptid
   WHERE EXISTS (SELECT 1
                   FROM employee e_in
                   JOIN department d_in ON e_in.deptid = d_in.deptid
                  WHERE d_in.deptid = d.deptid
               GROUP BY d_in.deptid
                 HAVING MAX(e_in.salary) = e.salary)

【讨论】:

    【解决方案4】:

    这样就可以了。

    SELECT E1.DEPT, E2.ENAME, E1.HIGHEST_SALARY
    FROM
    (SELECT DEPT, MAX(SALARY) HIGHEST_SALARY
    FROM EMPLOYEE
    GROUP BY DEPT) E1
    INNER JOIN EMPLOYEE E2 ON E1.HIGHEST_SALARY = E2.SALARY
    AND E1.DEPT = E2.DEPT
    

    【讨论】:

      【解决方案5】:
      select * from (select salary,last_name,dense_rank()
      over (order by salary desc)
      sal_rank from employees) where sal_rank <=3;
      

      就是这样......这是下面的输出:

      SALARY LAST_NAME                   SAL_RANK
      ---------- ------------------------- ----------
       24000 King                               1
       17000 Kochhar                            2
       17000 De Haan                            2
       14000 Russell                            3
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-01-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多