Таблица сотрудников - иерархия с некоторыми оговорками - PullRequest
0 голосов
/ 06 сентября 2018

У меня проблема со своего рода стандартной таблицей сотрудников. В моем примере я сделал самостоятельное присоединение к источнику, но не получил желаемую конечную структуру.

Иерархия на несколько уровней выше.

В простой форме код выглядит так:

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'

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

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

1 Ответ

0 голосов
/ 06 сентября 2018

Поэтому я бы написал это как три CTE (выражения общих таблиц), чтобы получить emp_Level + 1, emp_level + 2 и emp_level + 3, и я бы включил дескриптор уровня управления в CTE.

Затем я объединил бы три CTE для предоставления объединенного набора данных с максимум 3 записями на сотрудника, а затем создал бы динамическую сводную таблицу на основе описаний уровня управления. Вы должны быть в состоянии Google все эти процессы, но вернитесь с вашим кодом, если вы застряли.

Это действительно зависит от того, что вы собираетесь делать с данными после их получения. Возможно, имеет смысл позволить инструменту отчетности выполнять поворот, особенно если вы собираетесь использовать SSRS или Excel

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...