2013-03-21 37 views
2

我有一個表領域部門,僱員和工資的員工。我想要一個查詢來列出部門明智的最高工資和僱員的名字與該工資。集團的條款,以獲得最高薪酬員工的名字

我知道這很簡單。我用Google搜索,但發現答案是這樣,僅列出了部門和工資

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

什麼[RDBMS](http://en.wikipedia.org/wiki/Relational_database_management_system)您使用的? 'RDBMS'代表*關係數據庫管理系統*。 'RDBMS是SQL'的基礎,對於所有現代數據庫系統,如MS SQL Server,IBM DB2,Oracle,MySQL等... – 2013-03-21 05:03:34

+0

我正在使用mthql 2008 – Sharun 2013-03-21 05:04:32

+2

'ORDER BY'和'LIMIT'。並非您需要的所有代碼都可以來自Google。有時你需要爲自己思考。有時你需要_learn._ – 2013-03-21 05:05:20

回答

3

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 
+0

如果兩個員工有相同的工資(最高),返回重複行 – Sharun 2013-03-21 06:06:19

+0

@slacker,因爲在查詢中我使用了'DENSE_RANK()',它認爲這是有道理的,因爲兩名員工具有相同如果你只想得到一個你需要使用'ROW_NUMBER()'ex http://www.sqlfiddle.com/#!3/409d1/9 – 2013-03-21 06:09:10

+1

@slacker:好吧,應該是這樣的,這是對的,因爲可能有兩名員工獲得最高工資。 J W的回答在邏輯意義上是正確的。 – Rachcha 2013-03-21 06:13:56

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.* 
FROM employee e1 
JOIN (SELECT dept, MAX(salary) FROM employee GROUP BY dept) e2 ON 
    e1.dept = e2.dept AND e1.salary = e2.salary 
+0

我得到這個錯誤,如何糾正它? 'e2'的列2沒有指定列名稱。 – Learner 2014-09-18 09:58:21

+0

你使用了哪個數據庫? MSSQL,Postgres,MySQL,...? – aidan 2014-09-19 05:42:19

3

這將做到這一點。

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 
-1
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