【问题标题】:Recursive CTE and Count Info from recursive table递归表中的递归 CTE 和计数信息
【发布时间】:2015-09-10 15:08:01
【问题描述】:

我有这张表叫tblLandAreas:

Level 1 = Bloq
Level 2 = Ships
Level 3 = Sides
Level 4 = Beds

ShipBloq 的孩子,SidesShip 的孩子,BedSide 的孩子。

我需要以这种方式显示报告:

仅当_parentid is null

我试过了,但还是不行:

【问题讨论】:

    标签: sql database recursion common-table-expression


    【解决方案1】:

    尝试以下方法:

    DECLARE @t TABLE
        (
          ID INT ,
          ParentID INT ,
          Level INT
        )
    INSERT  INTO @t
    VALUES  ( 1, NULL, 1 ),
            ( 29, NULL, 1 ),
            ( 38, 29, 2 ),
            ( 32, 1, 2 ),
            ( 18, 1, 2 ),
            ( 41, 29, 2 ),
            ( 42, 41, 3 ),
            ( 43, 41, 3 ),
            ( 44, 41, 3 ),
            ( 45, 44, 4 )
    
    ;WITH cte AS(SELECT *, id AS baseid FROM @t WHERE ParentID IS NULL
                 UNION ALL
                 SELECT t.*, c.baseid FROM cte c JOIN @t t ON c.ID = t.ParentID)
    SELECT baseid, 
           SUM(CASE WHEN Level = 2 THEN 1 ELSE 0 END) ships,
           SUM(CASE WHEN Level = 3 THEN 1 ELSE 0 END) sides,
           SUM(CASE WHEN Level = 4 THEN 1 ELSE 0 END) beds
    FROM cte
    WHERE ParentID IS NOT NULL
    GROUP BY baseid
    

    输出:

    baseid  ships   sides   beds
    1       2       0       0
    29      2       3       1
    

    在你的结构上投影:

    ;WITH Bloque AS(SELECT LandAreaId, _ParentId, _Level, LandAreaId AS baseLandAreaId
                    FROM tblLandAreas WHERE _ParentId IS NULL
                    UNION ALL
                    SELECT a.LandAreaId, a._ParentId, a._Level, B.baseLandAreaId
                    FROM Bloque B 
                    JOIN tblLandAreas a ON B.LandAreaId = a._ParentId)
    SELECT baseLandAreaId AS LandAreaId, 
           SUM(CASE WHEN _Level = 2 THEN 1 ELSE 0 END) [#Ships],
           SUM(CASE WHEN _Level = 3 THEN 1 ELSE 0 END) [#Sides],
           SUM(CASE WHEN _Level = 4 THEN 1 ELSE 0 END) [#Beds]
    FROM Bloque
    WHERE _ParentId IS NOT NULL
    GROUP BY baseLandAreaId
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多