员工表-有一些警告的层次结构

时间:2018-09-06 11:31:58

标签: sql sql-server tsql

我遇到了一种标准的员工表问题。在我的示例中,我已经完成了对源的自我连接,但是我没有得到想要的最终结构。

层次结构向上扩展了几个层次。

简单的代码如下:

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 :(得分:0)

因此,我将其编写为三个CTE(公用表表达式)以获取emp_Level + 1,emp_level + 2和emp_level + 3,并将在CTE中包含管理级别描述符。

然后,我将UNION的三个CTE结合在一起,以提供每位员工最多3条记录的组合数据集,然后根据管理层的描述创建动态数据透视表。您应该能够对所有这些过程进行Google搜索,但是如果遇到问题,请返回代码。

这实际上取决于您拥有数据后将如何处理。让报表工具进行数据透视可能更有意义,特别是如果您要使用SSRS或Excel