2016-02-26 2 views
4

Я пытаюсь решить проблему SQL в Интернете, который имеет 2 таблицы как следующие,Как выбрать топ-3 зарплаты отдела?

Employee стол

таблица Сотрудник держит всех сотрудников.

+----+-------+--------+--------------+ 
| Id | Name | Sa1ary | DepartmentId | 
+----+-------+--------+--------------+ 
| 1 | Joe | 70000 |   1 | 
| 2 | Henry | 80000 |   2 | 
| 3 | Sam | 60000 |   2 | 
| 4 | Max | 90000 |   1 | 
| 5 | Janet | 69000 |   1 | 
| 6 | Randy | 85000 |   1 | 
+----+-------+--------+--------------+ 

Отдел стол

enter image description here

SQL, должна возвращать следующие данные

enter image description here

У меня есть запросы SQL как следующие,

SELECT D.Name AS Department, E.Name AS Employee, E.Salary AS Salary 
FROM Employee E INNER JOIN Department D ON E.DepartmentId = D.Id 
WHERE (SELECT COUNT(DISTINCT(Salary)) FROM Employee 
     WHERE DepartmentId = E.DepartmentId AND Salary > E.Salary) < 3 
ORDER by E.DepartmentId, E.Salary DESC; 

SQL хорош, но я немного смущен относительно части < 3. Разве это не должно быть = 3, так как в вопросе спрашивали о 3 зарплатах? Я ценю объяснение SQL и буду полезен.

+1

Вы уверены, что SQL правильный? –

+0

SQL корректен, и проблема связана с Leetocde Arefe

+0

Нет. Вы оцениваете ранг каждой зарплате. В тройку входят те, у которых ранг меньше или равен 3. – Strawberry

ответ

4

Если вы добавили столбец Count employees who earn more ваша таблица будет выглядеть следующим образом

+----+-------+--------+--------------+-------------------------------+ 
| Id | Name | Sa1ary | DepartmentId | Count employees who earn more | 
+----+-------+--------+--------------+-------------------------------+ 
| 1 | Joe | 70000 |   1 | 2       | 
| 2 | Henry | 80000 |   2 | 0       | 
| 3 | Sam | 60000 |   2 | 1       | 
| 4 | Max | 90000 |   1 | 0       | 
| 5 | Janet | 69000 |   1 | 3       | 
| 6 | Randy | 85000 |   1 | 1       | 
+----+-------+--------+--------------+-------------------------------+ 

Тогда, чтобы найти топ 3 в отдел. Ваш ГДЕ бы

WHERE `Count employees who earn more` < 3 

Если у вас =3 было бы вернуть только сотрудникам, что был четвёртым самым высоким

Поскольку у вас нет этого столбца, это то, что это SQL делает

(SELECT COUNT(DISTINCT(Salary)) FROM Employee 
     WHERE DepartmentId = E.DepartmentId AND Salary > E.Salary) 

Если вы хотите подготовить таблицу, описанную выше, вы можете сделать следующее:

SELECT 
     D.Name AS Department, 
     E.Name AS Employee, 
     E.Salary AS Salary, 
     Count(E2.Salary) as Count_employees_who_earn_more 
FROM Employee E 
INNER JOIN Department D 
ON E.DepartmentId = D.Id 
LEFT JOIN Employee E2 ON 
    e2.DepartmentId = E.DepartmentId 
    AND E2.Salary > E.Salary 
GROUP BY D.Name , 
     E.Name , 
     E.Salary 

Demo

+0

Если бы я хотел получить таблицу, которую вы опубликовали, какой SQL я должен писать? Я думаю, что ваш ответ хорош, я просто пытаюсь понять это. – Arefe

Смежные вопросы