我正在处理以下形式的一些分层数据:
Level Parent PrimaryKey LevelDepth RevenuePct
Total NULL 2786f8161 0 100
US Total 33f254b0f 1 60
UK Total 462adbba 1 25
Asia Total 5322678b3 1 15
Mobile US 75b72bdf1 2 10
Laptop US 813784df5 2 10
PC US 9550f97c 2 15
Consulting US a44ae3ef8 2 25
Mobile UK ace663d07 2 10
Laptop UK b373e61c 2 8
PC UK ca590ef44 2 7
Mobile Asia d136f267e 2 15
我希望它以下列形式显示:
Breakup Revenue [%]
Total 100
US 60
Mobile 10
Laptop 10
PC 15
Consulting 25
UK 25
Mobile 10
Laptop 8
PC 7
Asia 15
Mobile 15
实际问题有6-7级嵌套。
我是相对较新的领域,我正在尝试使用CTE,但由于子条目在不同的父母中重复(即我有美国,英国等移动类别......),因此我遇到连接条件问题。
答案 0 :(得分:2)
这是一种方法。 Path
列用于排序 - 您可能应该使用\ concatenate fixed-width level
来生成路径。查询通过递归调用cte部分来工作,直到没有行满足cte的第一部分(在union all之后的第二部分中表示为cte
)和table1之间的连接条件。
; with cte as (
select level, parent, revenuepct, leveldepth, cast (level as varchar(1000)) Path
from table1
where parent is null
union all
select a.level, a.parent, a.revenuepct, a.leveldepth, cast (path + '\' + a.level as varchar(1000))
from table1 a
inner join cte
on a.parent = cte.level
)
-- Simple indentation
select space(leveldepth * 4) + level as Breakup,
revenuepct as [revenue %]
from cte
order by path
-- Max recursive calls, 0 = unlimited
option (maxrecursion 10)