SQL 获取经理及其主管的级别
SQL to get the levels for a manager and his supervisors
我有员工 table,其数据格式如下
Employee
table
emplid supervisor employee_level
------------------------------------------
A xyx 5
B abc 5
xyz def 6
abc zzz 5
zzz xxx 6
employee_reports_to
:
emplid report_1 report2 report_3 reports_4
-----------------------------------------------------------
A yyy xdc def xyz
B xxx zzz abc
这是我需要的数据:
emplid supervisor level
-------------------------------------
A xyz 6
B zzz 6
谁能帮帮我?我需要找出每个员工的经理,然后找到每个经理级别,如果员工经理级别 5 然后选择他的老板,则只选择级别为 6 的经理。
谢谢
你需要多次加入 emp table(取决于层级)才能实现
with emp as
(
select 'A' emplid ,'xyx' supervisor ,5 as employee_level
union select 'B','abc',5
union select 'xyz','def',6
union select 'abc','zzz',5
union select 'zzz','xxx',6
)
,employee_reports_to as
(
select 'A' as emplid,'yyy' as report_1,'xdc' as report2,'def' as report_3,'xyz' as report_4
union select 'B','','xxx','zzz','abc'
)
,levels as(
select r.*,er1.employee_level as r1_l
,er2.employee_level as r2_l
,er3.employee_level as r3_l
,er4.employee_level as r4_l
from employee_reports_to r
left join emp er1 on er1.emplid = r.report_1
left join emp er2 on er2.emplid = r.report2
left join emp er3 on er3.emplid = r.report_3
left join emp er4 on er4.emplid = r.report_4
)
select emplid
,case when r1_l = 6 then report_1
when r2_l = 6 then report2
when r3_l = 6 then report_3
when r4_l = 6 then report_4
else null end as level_6_manager
,6 as level
from levels
Result
Upvote if you find this answer useful
我有员工 table,其数据格式如下
Employee
table
emplid supervisor employee_level
------------------------------------------
A xyx 5
B abc 5
xyz def 6
abc zzz 5
zzz xxx 6
employee_reports_to
:
emplid report_1 report2 report_3 reports_4
-----------------------------------------------------------
A yyy xdc def xyz
B xxx zzz abc
这是我需要的数据:
emplid supervisor level
-------------------------------------
A xyz 6
B zzz 6
谁能帮帮我?我需要找出每个员工的经理,然后找到每个经理级别,如果员工经理级别 5 然后选择他的老板,则只选择级别为 6 的经理。
谢谢
你需要多次加入 emp table(取决于层级)才能实现
with emp as
(
select 'A' emplid ,'xyx' supervisor ,5 as employee_level
union select 'B','abc',5
union select 'xyz','def',6
union select 'abc','zzz',5
union select 'zzz','xxx',6
)
,employee_reports_to as
(
select 'A' as emplid,'yyy' as report_1,'xdc' as report2,'def' as report_3,'xyz' as report_4
union select 'B','','xxx','zzz','abc'
)
,levels as(
select r.*,er1.employee_level as r1_l
,er2.employee_level as r2_l
,er3.employee_level as r3_l
,er4.employee_level as r4_l
from employee_reports_to r
left join emp er1 on er1.emplid = r.report_1
left join emp er2 on er2.emplid = r.report2
left join emp er3 on er3.emplid = r.report_3
left join emp er4 on er4.emplid = r.report_4
)
select emplid
,case when r1_l = 6 then report_1
when r2_l = 6 then report2
when r3_l = 6 then report_3
when r4_l = 6 then report_4
else null end as level_6_manager
,6 as level
from levels
Result
Upvote if you find this answer useful