2015-06-24 3 views
0

Я эта таблица под названием tblLandAreas:Рекурсивный CTE и графы Информации из рекурсивной таблицы

enter image description here

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

Ship является потомком Bloq, Sides является дочерним Ship и Bed является дочерним Side ,

И мне нужно, чтобы показать Доложить об этом так:

enter image description here

Только когда _parentid is null

Я попытался это, но он не работает:

enter image description here

ответ

0

Try следующие:

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