【问题标题】:CTE with Pivot Table带有数据透视表的 CTE
【发布时间】:2016-10-20 17:54:44
【问题描述】:

我有一张桌子:TblMemberPosition

运行 sql 代码 -

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 生成的。你能帮助为所有成员生成这个结构吗?

【问题讨论】:

    标签: c# sql sql-server pivot common-table-expression


    【解决方案1】:
    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 个列。

    【讨论】:

      【解决方案2】:

      这应该可以满足您对根级别成员的需求,即没有赞助商的成员。

      ;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]
      

      【讨论】:

        猜你喜欢
        • 2012-07-13
        • 1970-01-01
        • 2022-01-05
        • 1970-01-01
        • 1970-01-01
        • 2021-06-04
        • 2015-11-17
        • 1970-01-01
        相关资源
        最近更新 更多