首页
学习
活动
专区
圈层
工具
发布

EN

Stack Overflow用户
提问于 2020-02-04 19:06:28
回答 1查看 82关注 0票数 0

我发现了很多创建员工报告结构层次结构的例子。不过,我想进一步了解一下,每一位员工都会找到他们直接向首席执行官汇报的高管。鉴于以下数据:

代码语言:javascript
复制
ID          FullName                                           HRLevel    SupervisorID
----------- -------------------------------------------------- ---------- ------------
1           Pam Beesly                                         CEO        NULL
2           Angela Martin                                      SVP        1
3           Kelly Kapoor                                       SVP        1
4           Meredith Palmer                                    SVP        1
5           Phyllis Vance                                      AVP        3
6           Jan Levinson                                       AVP        4
7           Erin Hannon                                        Associate  5
8           Karen Filippelli                                   Intern     5

我想要一个所有员工的名单与HRLevel的SVP及以下,以显示SVP级别的雇员,他们报告给。所以它可能是他们的直接主管,也可能是他们上面的4层。另外,如果一名员工直接向首席执行官报告,我希望该雇员被列为DepartmentHead。

以下是我到目前为止所拥有的:

代码语言:javascript
复制
;WITH cte_employees (ID, FullName, HRLevel, SupervisorID, SupervisorName) AS
(
    SELECT ID
         , FullName
         , HRLevel
         , SupervisorID
         , CONVERT(VARCHAR(50), NULL) AS [SupervisorName]
    FROM   #Employees
    WHERE  HRLevel = 'SVP'
    UNION ALL
    SELECT     e.ID
             , e.FullName
             , e.HRLevel
             , e.SupervisorID
             , c.FullName AS [SupervisorName]
    FROM       #Employees    e 
    INNER JOIN cte_employees c
    ON e.SupervisorID = c.ID
)
SELECT c2.ID
     , c2.FullName
     , c2.HRLevel
     , c2.SupervisorID
     , COALESCE(c2.SupervisorName, c2.FullName) AS [DepartmentHead]
FROM   cte_employees c2;

这会产生直接主管,而不是SVP DepartmentHead:

代码语言:javascript
复制
ID          FullName                                           HRLevel    SupervisorID DepartmentHead
----------- -------------------------------------------------- ---------- ------------ --------------------------------------------------
2           Angela Martin                                      SVP        1            Angela Martin
3           Kelly Kapoor                                       SVP        1            Kelly Kapoor
4           Meredith Palmer                                    SVP        1            Meredith Palmer
5           Phyllis Vance                                      AVP        3            Kelly Kapoor
6           Jan Levinson                                       AVP        4            Meredith Palmer
7           Erin Hannon                                        Associate  5            Phyllis Vance
8           Karen Filippelli                                   Intern     5            Phyllis Vance

我得到的和我想要的唯一的区别是,员工I 7和8应该有一个Kapoor的SVP DepartmentHead。

这是我的[医]小提琴,显示了这一点。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-02-04 19:31:02

你很亲密:

代码语言:javascript
复制
IF OBJECT_ID('tempdb.dbo.#Employees ', 'U') IS NOT NULL DROP TABLE #Employees;

CREATE TABLE #Employees(ID INT,
FullName VARCHAR(50),
HRLevel VARCHAR(10),
SupervisorID INT)

INSERT INTO #Employees VALUES (1, 'Pam Beesly', 'CEO', NULL)
INSERT INTO #Employees VALUES (2, 'Angela Martin', 'SVP', 1)
INSERT INTO #Employees VALUES (3, 'Kelly Kapoor', 'SVP', 1)
INSERT INTO #Employees VALUES (4, 'Meredith Palmer', 'SVP', 1)
INSERT INTO #Employees VALUES (5, 'Phyllis Vance', 'AVP', 3)
INSERT INTO #Employees VALUES (6, 'Jan Levinson', 'AVP', 4)
INSERT INTO #Employees VALUES (7, 'Erin Hannon', 'Associate', 5)
INSERT INTO #Employees VALUES (8, 'Karen Filippelli', 'Intern', 5)



;WITH cte_employees (ID, FullName, HRLevel, SupervisorID, SupervisorName) AS
(
    SELECT ID
         , FullName
         , HRLevel
         , SupervisorID
         , FullName AS [SupervisorName]
    FROM   #Employees
    WHERE  HRLevel = 'SVP'
    UNION ALL
    SELECT     e.ID
             , e.FullName
             , e.HRLevel
             , e.SupervisorID
             , c.SupervisorName AS [SupervisorName]
    FROM       #Employees    e 
    INNER JOIN cte_employees c
    ON e.SupervisorID = c.ID
)
SELECT c2.ID
     , c2.FullName
     , c2.HRLevel
     , c2.SupervisorID
     , c2.SupervisorName AS [DepartmentHead]
FROM   cte_employees c2;
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60064041

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档