2015-12-18 14 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