2015-12-18 13 views
2

我拥有名称,工资和员工部门的数据库。 我需要一个查询来获取每个部门中薪水最高的员工。与GROUP BY子句一起使用的MAX函数

数据库:

create table test(
    employee_name VARCHAR(255), 
    department VARCHAR(255), 
    salary INT 
); 

数据:

INSERT INTO test(employee_name, department, salary) VALUES 
("John", "DepartmentA", 1500), 
("Sarah","DepartmentA", 1600), 
("Romel","DepartmentA", 1400), 
("Victoria","DepartmentB", 1400), 
("Maria", "DepartmentB", 1600); 

我尝试:

1.1 WHERE MAX(工资)=薪水GROUP BY部门

SELECT employee_name, salary FROM test WHERE MAX(salary) = salary GROUP BY department; 
ERROR 1111 (HY000): Invalid use of group function 

1.2。当我硬编码值替换MAX(工资),它可以作为我期望:

SELECT employee_name, salary FROM test WHERE 1600 = salary GROUP BY department; 
+---------------+--------+ 
| employee_name | salary | 
+---------------+--------+ 
| Sarah   | 1600 | 
| Maria   | 1600 | 
+---------------+--------+ 
2 rows in set (0.00 sec) 
  • 错误答案与具有条款(而不是每个部门单个结果):

    SELECT employee_name,salary FROM test GROUP BY department HAVING MAX(salary)= salary;

    + --------------- + -------- + | employee_name |薪水| + --------------- + -------- + |玛丽亚| 1600 | + --------------- + -------- + 1行中集(0.00秒)

  • 我期望的那样的结果是什么:

    Sarah, DepartmentA 
    Maria, DepartmentB 
    

    回答

    4

    首先,你必须让每个部门的最高薪水:

    SELECT department, max(salary) as max_salary 
    FROM test 
    GROUP BY department 
    

    ,那么你可以加入这回子查询测试表:

    SELECT t.* 
    FROM 
        test t INNER JOIN (
        SELECT department, max(salary) as max_salary 
        FROM test 
        GROUP BY department 
    ) d ON t.department=d.department AND t.salary=d.max_salary 
    
    +0

    这是正确的答案r(这是我刚刚发布的,只有格式上的细微差别) – user5151179

    +1

    只是一个小的事情来纠正:GORUP BY - > GROUP BY – joro

    0

    试试这个:

    SELECT t1.employee_name, t1.department 
    FROM test t1 
    INNER JOIN (SELECT t2.department, MAX(t2.salary) AS salary 
          FROM test t2 
          GROUP BY t2.department 
         ) AS t2 ON t1.department = t2.department AND t1.salary = t2.salary; 
    
    1

    您可以编写相关子查询为:

    select employee_name, 
    department, 
    salary 
    from test T1 where T1.salary = (select max(T2.salary) 
               from test T2 
               where T1.department = T2.department 
               group by T2.department 
               ) 
    

    demo

    ...但是请注意,它会比不相关的慢得多相当于

    +0

    为什么一个投票..plz帮我理解这里有什么问题.. – Deepshikha

    +0

    我测试过它和它似乎工作得很好。从我投票 – joro

    +0

    谢谢Joro,请参考[链接](http://stackoverflow.com/help/someone-answers) – Deepshikha