У меня проблема со своего рода стандартной таблицей сотрудников. В моем примере я сделал самостоятельное присоединение к источнику, но не получил желаемую конечную структуру.
Иерархия на несколько уровней выше.
В простой форме код выглядит так:
select e.employee_name
, e.teamlead_name
, e1.teamlead_name 'manager_name'
, e2.teamlead_name 'senior_manager_name'
, e3.teamlead_name 'director_name'
from employees e
left join employees e1 on
e.teamlead_id = e1.employee_id
left join employees e2 on
e1.teamlead_id = e2.employee_id
left join employees e3 on
e2.teamlead_id = e3.employee_id
Это дает мне хорошую базу, но директор, например, станет руководителем группы, когда один из их прямых отчетов будет указан в качестве сотрудника. Также получите ту же проблему, но для менеджеров и старших менеджеров, где они не будут на уровне, который вы ожидаете. Это не будет проблемой, за исключением отчетов, когда иерархия не соответствует ожиданиям конечных пользователей, поскольку директор, старшие менеджеры и менеджеры попадают на все уровни иерархии.
Я бы предпочел в этом случае структурировать данные, как показано ниже.
В настоящее время это так
employee_name director_name null null null
Хотелось бы это
employee_name null null null director_name
Я как-то нашел способ обойти эту проблему с помощью операторов case, однако это не совсем чистый способ сделать это, и я надеюсь, что есть более хороший способ сделать это.
Чтобы правильно выровнять директора, это проще, так как над ними никого нет, поэтому я сделал что-то вроде нижеприведенного, который работает и всегда выравнивает директора по правильному месту, тогда я отдельно использую nullif, когда для обнуления других столбцов это делается с помощью CTE.
concat (e3.teamlead_name,
case when e1.teamlead_name is null
and e2.teamlead_name is null
and e3.teamlead_name is null
then e.teamlead_name end,
case when e2.teamlead_name is null
and e3.teamlead_name is null
then e1.teamlead_name end,
case when e3.teamlead_name is null
then e2.teamlead_name end) 'director_name'
Директор не является сотрудником этой системы, они существуют только в качестве руководителя группы и выше.
Я думаю, что, возможно, смогу решить и со временем все выровнять, как они хотят, чтобы это делалось в соответствии с вышеизложенным, но, конечно, есть гораздо лучший способ сделать это? Любое руководство будет оценено. Спасибо