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

これを行う 1 つの方法を次に示します。Pathcolumn はソートに使用されます - おそらく \ concatenate 固定幅の代わりにlevelパスを生成する必要があります。cteクエリは、cte の最初の部分 ( union all の後の 2 番目の部分として表される) と table1の間の結合条件を満たす行がなくなるまで、cte 部分を再帰的に呼び出すことによって機能します。

; 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 に答える