SQL-запрос на одну таблицу

58
7

Мне нужен SQL-запрос для следующей задачи

Table: EMPLOYEE  
DeptCode Level EmpID Name
Mkt VP 1 JOHN
Mkt GM 2 BOB
Mkt CLERK 3 TIM
IT GM 4 BILLY
IT GM 5 JESSICA
IT CLERK 6 MONICA
HR VP 7 NIKITA
HR GM 8 TOM
HR GM 9 HARRY

Вопрос: Для каждого отдела я хочу найти сотрудника, который находится на самом высоком уровне в этом отделе. Если на определенном уровне есть два или более emp на самом высоком уровне. то за этот отдел не должны поступать записи

Иерархия уровня: VP> GM> CLERK

Поэтому я должен получить следующие результаты

DeptCode    Level   EmpID   Name  
Mkt VP 1 JOHN
HR VP 7 NIKITA

Для ИТ не существует emp на уровне VP. Следующий уровень - GM, но на этом уровне есть две emp, поэтому для ИТ-отдела не выбрана запись

Я был бы очень признателен, если бы вы могли предложить ответ или способ продвижения по этому вопросу.

спросил(а) 2014-06-20T20:46:00+04:00 6 лет, 3 месяца назад
1
Решение
88

SELECT  e.*
FROM (
SELECT DISTINCT
deptCode
FROM employee
) ed
JOIN employee e
ON e.empId =
(
SELECT empId
FROM employee ei
WHERE ei.deptCode = ed.deptCode
ORDER BY
FIND_IN_SET(level, 'VP,GM,CLERK')
LIMIT 1
)
WHERE NOT EXISTS
(
SELECT NULL
FROM employee eo
WHERE (eo.deptCode, eo.level) = (e.deptCode, e.level)
AND eo.empId <> e.empId
)

ответил(а) 2014-06-20T20:54:00+04:00 6 лет, 3 месяца назад
40

Сделайте еще одну таблицу для Уровней с полем для Ранга.

Level   Rank
VP 1
GM 2
CLERK 3

Затем сделайте вид (т.е. vHighestRankPerDept), который выглядит так:

SELECT Levels.Level AS HighestLevel, t.DeptCode
FROM (SELECT MIN(Levels.Rank) AS Highest, Employee.DeptCode
FROM Levels INNER JOIN Employee ON Employee.Level = Levels.Level
GROUP BY Employee_1.DeptCode) AS t
INNER JOIN Levels ON Levels.Rank = t.Highest

Затем:

SELECT Employee.DeptCode, Employee.Level, MAX(Employee.EmpID) AS EmpID, MAX(Employee.Name) AS Name
FROM Employee
INNER JOIN vHighestRankPerDept ON vHighestRankPerDept.DeptCode = Employee.DeptCode
AND Employee.Level = vHighestRankPerDept.HighestLevel
GROUP BY Employee.DeptCode, Employee.Level
HAVING COUNT(Employee.Level) = 1

ответил(а) 2014-06-20T21:33:00+04:00 6 лет, 3 месяца назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема