我有一个包含父子层次结构的表以及一个列,该列告诉当前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”,依此类推。
存储过程也是我能想到的可能解决方案。谁做过这样的事情?
感谢您的帮助!
/安德烈亚斯
答案 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