【问题标题】:Flatten hierarchical sql output展平分层 sql 输出
【发布时间】:2018-04-06 14:30:52
【问题描述】:

如何为以下用例将分层数据展平为列

Current: EmployeeID, ManagerID


Transformed: EmployeeID, ManagerID, ManagersManagerID...

没有经理的员工的经理 ID 将为 NULL

具有大经理层级的员工将有那么多列,最后一列为 NULL。例如,具有 4 级层次结构的员工将具有以下列

EmployeeID, ManagerID, Level2ManagerID,  Level3ManagerID, Level4ManagerID, Level5ManagerID

这里 Level5ManagerID 将为 NULL

【问题讨论】:

  • 你已经写过代码了吗?

标签: sql-server


【解决方案1】:

一种选择是使用标准的递归 cte 通过 PATH 构建层次结构,然后使用一点 XML 解析路径

这假设您知道最高级别

示例

Declare @YourTable Table ([ManagerID] varchar(50),[EmployeeID] varchar(50))
Insert Into @YourTable Values 
 (null ,'S-1')
,('S-1','S-11')
,('S-1','S-12')
,('S-1','S-13')
,('S-1','S-14')
,('S-1','S-15')
,('S-11','S-111')
,('S-11','S-112')

;with cteP as (
      Select EmployeeID
            ,ManagerID 
            ,PathID = cast(EmployeeID as varchar(max))
      From   @YourTable
      Where  ManagerID is Null
      Union  All
      Select EmployeeID  = r.EmployeeID
            ,ManagerID  = r.ManagerID 
            ,PathID = cast(p.PathID+','+cast(r.EmployeeID as varchar(25)) as varchar(max))
      From   @YourTable r
      Join   cteP p on r.ManagerID  = p.EmployeeID)
Select [EmpID] = EmployeeID
      ,B.*
 From  cteP A
 Cross Apply (
                Select Level1 = xDim.value('/x[1]','varchar(max)')
                      ,Level2 = xDim.value('/x[2]','varchar(max)')
                      ,Level3 = xDim.value('/x[3]','varchar(max)')
                      ,Level4 = xDim.value('/x[4]','varchar(max)')
                      ,Level5 = xDim.value('/x[5]','varchar(max)')
                From  (Select Cast('<x>' + replace(PathID,',','</x><x>')+'</x>' as xml) as xDim) as X 
             ) B

  Order By PathID

退货

EmpID   Level1  Level2  Level3  Level4  Level5
S-1     S-1     NULL    NULL    NULL    NULL
S-11    S-1     S-11    NULL    NULL    NULL
S-111   S-1     S-11    S-111   NULL    NULL
S-112   S-1     S-11    S-112   NULL    NULL
S-12    S-1     S-12    NULL    NULL    NULL
S-13    S-1     S-13    NULL    NULL    NULL
S-14    S-1     S-14    NULL    NULL    NULL
S-15    S-1     S-15    NULL    NULL    NULL

【讨论】:

  • @JohnCappelleti 我已经发布了一个关于层次结构的类似问题。你似乎精通这个主题。请您看一下,如果您能想到任何解决方案,请告诉我? stackoverflow.com/questions/49022116/…
  • @JWeezy 我来看看
猜你喜欢
  • 1970-01-01
  • 2019-02-04
  • 1970-01-01
  • 2017-04-24
  • 1970-01-01
  • 2016-06-20
  • 1970-01-01
  • 1970-01-01
  • 2020-07-15
相关资源
最近更新 更多