SQL:展平缺少级别的层次结构

时间:2014-02-11 12:31:46

标签: sql sql-server stored-procedures pivot

我有一个包含父子层次结构的表以及一个列,该列告诉当前id是哪个层次结构级别。

一个例子:

id   pid    level
A             H1
B     A       H2
C     B       H3
D     C       H4 
E             H1
F     E       H3
G     F       H4

我希望将其换位或展平,为最低级别的每个id创建一行一行。

像这样:

id    H1    H2    H3    H4
D     A     B     C     D
G     E           F     G

您可以使用pivot在SQL中执行此操作吗?我在想,也许“level”列的值可以用作结果表中列的名称?值“H1”映射到列名“H1”,依此类推。

存储过程也是我能想到的可能解决方案。谁做过这样的事情?

感谢您的帮助!

/安德烈亚斯

1 个答案:

答案 0 :(得分:1)

我创建了一个包含数据的表ttt。此查询将为您调整五个级别:

select id
     , [H1], [H2], [H3], [H4], [H5]
from
( 
  select distinct
         coalesce(c6.id,c5.id,c4.id,c3.id,c2.id,c1.id) as id
       , c1.id as lid
       , c1.level 
    from ttt c1
    left join ttt c2
      on c1.id = c2.pid
    left join ttt c3
      on c2.id = c3.pid
    left join ttt c4
      on c3.id = c4.pid
    left join ttt c5
      on c4.id = c5.pid
    left join ttt c6
      on c5.id = c6.pid ) as sourcetable
  pivot ( max(lid) 
    for level in ([H1], [H2], [H3], [H4], [H5])
    ) as pivottable;

你可以在sqlfiddle上查看:example