2013-03-21 3 views
2

У меня есть таблица Сотрудник с отделом полей, сотрудник и зарплата. Я хочу, чтобы запрос отображал самые высокие зарплаты Департамента и имя сотрудника с этой зарплатой.Группа по оговорке, чтобы получить имя самого высокооплачиваемого сотрудника

Я знаю, что это просто. Я гугле но нашел ответы, как это, в котором перечислены только отдел и зарплату

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

Что [РСУБД] (http://en.wikipedia.org/wiki/Relational_database_management_system) вы используете? 'RDBMS' означает * Реляционная система управления базами данных *. 'RDBMS является основой для SQL' и для всех современных систем баз данных, таких как MS SQL Server, IBM DB2, Oracle, MySQL и т. Д. –

+0

Я использую mssql 2008 – Sharun

+2

' ORDER BY' и 'LIMIT'. Не каждый фрагмент кода, который вам понадобится, может поступать из Google. Иногда вам нужно думать о себе. Иногда вам нужно _learn._ –

ответ

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

+0

@slacker, потому что в запросе я использовал 'DENSE_RANK()', и он считает, что это имеет смысл, потому что двое из сотрудников имеют одинаковые зарплата, в которой, в свою очередь, самая высокая в отделе, если вы хотите ее получить, вам нужно использовать 'ROW_NUMBER()' ex http://www.sqlfiddle.com/#!3/409d1/9 –

+1

@slacker: Ну, это должно быть так, и это правильно, поскольку могут быть два сотрудника, получающих самую высокую зарплату. Ответ J W прав в логическом смысле. – Rachcha

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

Я получаю эту ошибку, как ее исправить? Для столбца 2 «e2» не указано имя столбца. – Learner

+0

Какую базу данных вы используете? MSSQL, Postgres, MySQL, ...? – aidan

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 
Смежные вопросы