2

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

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

4

1 回答 1

2

这是一种方法。Path列用于排序 - 您可能应该而不是 \ 连接固定宽度level来生成路径。查询通过递归调用 cte 部分来工作,直到没有行满足 cte 的第一部分(表示为cteunion all 之后的第二部分)和 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)

这是带有示例的 Sql Fiddle

这是关于递归 cte 的文章的链接

于 2012-08-08T14:46:04.580 回答