sql遍历父子

时间:2012-08-08 14:24:10

标签: sql-server hierarchical

我正在处理以下形式的一些分层数据:

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,但由于子条目在不同的父母中重复(即我有美国,英国等移动类别......),因此我遇到连接条件问题。

1 个答案:

答案 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)

Here is Sql Fiddle with example

And here is a link to article on recursive cte