2016-06-19 8 views
3

と私はテーブルを持っています:SQLコードを実行TblMemberPositionCTEは、ピボットテーブル

- 上記のクエリの

with cte(MemberID, SponserID, Level) 
    as 
    (
     select MemberID, SponserID, 1 as Level 
     from TblMemberPosition 
     where MemberID = 10021 
     union all 
     select a.MemberID, a.SponserID , Level + 1 
     from TblMemberPosition as a 
     inner join cte as b 
      on b.MemberID = a.SponserID 
    ) 
    select (count (MemberID)) as MemberCount, Level 
    From cte 
    where Level <= 8 
    Group by Level 
    order by Level 

結果:

MemberCount Level 
1    1 
1    2 
3    3 
1    4 
2    5 
1    6 
1    7 
2    8 

をしかし、私はしたいです出力Like-

MemberID Level1 Level 2 Level 3 Level 4 .... Level upto 9 
10021  1   1   3  1 

このコードは、単一のMemberIdに対して生成されています。すべてのメンバーにこの構造を生成させるのに役立つことができますか?

答えて

0
with cte(MemberID, SponserID, Level) 
as 
(
select MemberID, SponserID,1 as Level from TblMemberPosition 
where MemberID = 10021 
    union all 
    select a.MemberID,a.SponserID,Level + 1 from TblMemberPosition 
    as a inner join cte as b on b.MemberID = a.SponserID 
), 
ctePivotSource as (
    select 
     (count (MemberID)) as MemberCount, 
     'Level ' + convert(varchar(1),[Level]) as [Level] 
    from cte 
    where Level <=8 
    group by level 
) 
select * 
from 
    (select [MemberID],[MemberCount],[Level] from ctePivotSource) src 
pivot 
( 
    sum(src.MemberCount) FOR [Level] in ([Level 1],[Level 2],[Level 3],[Level 4],[Level 5],[Level 6],[Level 7],[Level 8]) 
) as pvt 

元のクエリでは、カラムを8個に制限しています(必要な結果では9個ではありません)ので、ピボットを8個のカラムに制限しました。

0

これは、あなたがスポンサーを持たないメンバーを意味するルートレベルメンバーに欲しいと思うでしょう。

;WITH cte AS 
(
    SELECT MemberID, 
      SponserID, 
      MemberID AS [Root] -- this will be your grouping 
      0 AS [Level] -- not sure you want to count yourself 
    FROM TblMemberPosition 
    WHERE SponsorID IS NULL -- get highest level members only? 
    UNION ALL 
    SELECT a.MemberID, 
      a.SponserID, 
      [Root], 
      [Level] + 1 
    FROM TblMemberPosition AS a 
      INNER JOIN cte AS b ON b.MemberID = a.SponserID 
) 
SELECT [Root] AS MemberID, 
     COUNT(CASE WHEN [Level] = 1 THEN 1 END) AS [Level1], 
     COUNT(CASE WHEN [Level] = 2 THEN 1 END) AS [Level2], 
     COUNT(CASE WHEN [Level] = 3 THEN 1 END) AS [Level3], 
     COUNT(CASE WHEN [Level] = 4 THEN 1 END) AS [Level4], 
     COUNT(CASE WHEN [Level] = 5 THEN 1 END) AS [Level5], 
     COUNT(CASE WHEN [Level] = 6 THEN 1 END) AS [Level6], 
     COUNT(CASE WHEN [Level] = 7 THEN 1 END) AS [Level7], 
     COUNT(CASE WHEN [Level] = 8 THEN 1 END) AS [Level8], 
     COUNT(CASE WHEN [Level] = 9 THEN 1 END) AS [Level9] 
FROM cte 
GROUP BY [Root]