2016-01-20 3 views
1

Я хочу создать иерархический отчет в SSRS с помощью этой простой таблицы? Не могли бы вы помочь? Я следую учебнику здесь: https://www.mssqltips.com/sqlservertip/1939/working-with-a-parent-child-hierarchy-in-sql-server-reporting-services-ssrs/SSRS: рекурсивный родительский ребенок

но я не могу понять, как EmployeeKey и ParentEmployeeKey применяются к моей таблице. Насколько моя таблица касается Col2, является ли Employee и Col1 родителем. Но в SSRS, когда я группирую Col2, а Recursive Parent - COL1, я не получаю желаемого результата.

Вот мой стол:

╔══════════════╦══════════════╗ 
║  COL1  ║  COL2  ║ 
╠══════════════╬══════════════╣ 
║ TEST01  ║ TEST02  ║ 
║ TEST01  ║ TEST03  ║ 
║ TEST01  ║ TEST04  ║ 
║ TEST02  ║ LAB   ║ 
║ TEST02  ║ STL40  ║ 
║ TEST03  ║ LABSTL  ║ 
║ TEST03  ║ STLSCH40  ║ 
║ TEST04  ║ LABSTL  ║ 
║ TEST04  ║ FLG41  ║ 
║ TEST04  ║ STLSCH40  ║ 
╚══════════════╩══════════════╝ 

Это результат, который я хочу получить с помощью SSRS. как отступа стиль картины .. enter image description here

╔═══════════════╦══╗ 
║  COL1  ║ ║ 
╠═══════════════╬══╣ 
║ TEST01  ║ ║ 
║ -TEST02  ║ ║ 
║ ----LAB  ║ ║ 
║ ----STL40  ║ ║ 
║ -TEST03  ║ ║ 
║ ----LABSTL ║ ║ 
║ ----STLSCH40 ║ ║ 
║ -TEST04  ║ ║ 
║ ----LABSTL ║ ║ 
║ ----FLG41  ║ ║ 
║ ----STLSCH40 ║ ║ 
╚═══════════════╩══╝ 

я не знаю, чтобы получить результат отступа стиля выше. Нужно ли использовать HierarchyID и IsDescendantOf или рекурсивный CTE. Это рекурсивный CTE, который я сделал, и результат под ним.

Declare @Col1 varchar(30)='TEST01'; 
Declare @BomLevel Integer=0; 
WITH tBOM 
AS 
(
select a.Col1 , a.Col2, @BomLevel "BOMLevel" from Component A 
WHERE Col1= @Col1 
UNION ALL 
Select c.Col1, c.Col2, BomLevel+1 From Component C 
INNER JOIN tBOM on tBOM.Col2=c.Col1 
) 
select Col1,Col2 ,BOMLevel from tbom 


Col1        Col2       BOMLevel 
TEST01      TEST02       0 
TEST01      TEST03       0 
TEST01      TEST04       0 
TEST02      STL40       1 
TEST02      LAB        1 
TEST03      STLSCH40      1 
TEST03      LABSTL       1 
TEST04      STLSCH40      1 
TEST04      FLG41       1 
TEST04      LABSTL       1 

ответ

2

Это должно работать на любой глубине (при условии, что вы не передаете VARCHAR (50) для SORT_PATH). «Trick», пока вы идете вниз по иерархии, вы создаете строку, которую вы можете сортировать (SORT_PATH). В конце мы можем использовать REPLICATE() с нашим BOMLevel с отступом с чем-то (в данном случае дефис).

SET NOCOUNT ON; 

DECLARE @Component AS TABLE (
     COL1 VARCHAR(50) , 
     COL2 VARCHAR(50) 
     ); 

INSERT INTO @Component 
     (COL1, COL2) 
VALUES (NULL,  'TEST01'), -- ADDED 
     ('TEST01', 'TEST02'), 
     ('TEST01', 'TEST03'), 
     ('TEST01', 'TEST04'), 
     ('TEST02', 'LAB' ), 
     ('TEST02', 'STL40' ), 
     ('TEST03', 'LABSTL'), 
     ('TEST03', 'STLSCH40'), 
     ('TEST04', 'LABSTL'), 
     ('TEST04', 'FLG41' ), 
     ('TEST04', 'STLSCH40') 

; 
WITH tBOM 
      AS (SELECT A.COL1 , -- PARENT 
         A.COL2 , -- CURRENT 
         0 AS "BOMLevel", 
         CAST(A.COL2 AS VARCHAR(50)) AS SORT_PATH 
       FROM  @Component A 
       WHERE A.COL1 IS NULL 
       UNION ALL 
       SELECT C.COL1 , 
         C.COL2 , 
         BOMLevel + 1, 
         CAST(SORT_PATH + '.' + C.COL2 AS VARCHAR(50)) AS SORT_PATH 
       FROM  @Component C 
         INNER JOIN tBOM ON tBOM.COL2 = C.COL1 
      ) 
    SELECT COL1 , 
      COL2 , 
      BOMLevel, 
      SORT_PATH, 
      REPLICATE('-', tBOM.BOMLevel) + COL2 AS DISPLAY_PATH 
    FROM tBOM 
    ORDER BY SORT_PATH 
+0

Hm. Это решение намного проще. Мне не приходило в голову, как это выглядит. Единственное, что я добавил бы (если это даже имеет значение для вопроса), это 'REPLICATE ('-', SQUARE (BOMLevel))' будет производить полный желаемый результат. – ZLK

+0

Я забыл сказать, что хочу добиться этого, используя SSRS. Но я попробую это. спасибо – BobNoobGuy

+0

Да! Я понимаю это. Исправьте ключ, чтобы иметь этот тип SORT_PATH/key, чтобы определить, какая строка принадлежит тому, кто является родителем! – BobNoobGuy

0

Это похоже рода фанки способ сделать это, но я не могу думать о хорошем пути для вывода результатов в формате вы ожидаете:

CREATE TABLE #table (Col1 NVARCHAR(100), Col2 NVARCHAR(100)) 
INSERT #table VALUES ('TEST01', 'TEST02') 
, ('TEST01', 'TEST03') 
, ('TEST01', 'TEST04') 
, ('TEST02', 'LAB') 
, ('TEST02', 'STL40') 
, ('TEST03', 'LABSTL') 
, ('TEST03', 'STLSCH40') 
, ('TEST04', 'LABSTL') 
, ('TEST04', 'FLG41') 
, ('TEST04', 'STLSCH40'); 

WITH CTE1 AS (
    SELECT C1.Col1 C1 
     , C2.Col2 C2 
     , C3.Col2 C3 
     , ROW_NUMBER() OVER (ORDER BY C1.Col1, C2.Col2, C3.Col2) RN 
    FROM (SELECT Col1 FROM #table WHERE Col1 NOT IN (SELECT Col2 FROM #table)) C1 
    LEFT JOIN #table C2 ON C2.Col1 = C1.Col1 
    LEFT JOIN #table C3 ON C3.Col1 = C2.Col2 
    GROUP BY C1.Col1, C2.Col2, C3.Col2) 
, CTE2 AS (
    SELECT CASE WHEN RN = 1 THEN C1 ELSE NULL END C1 
    , CASE WHEN RN = 1 THEN CAST('-' + C2 AS NVARCHAR(100)) 
     WHEN (SELECT C2 FROM CTE1 WHERE RN = C.RN-1) = C2 THEN NULL 
     ELSE CAST('-' + C2 AS NVARCHAR(100)) END C2 
    , CASE WHEN RN = 1 THEN CAST('----' + C3 AS NVARCHAR(100)) 
     WHEN (SELECT C3 FROM CTE1 WHERE RN = C.RN-1) = C3 THEN NULL 
     ELSE CAST('----' + C3 AS NVARCHAR(100)) END C3 
    FROM CTE1 C) 
SELECT Col1 
FROM CTE2 
UNPIVOT (Col1 FOR Col IN (C1, C2, C3)) a 

DROP TABLE #table 

Воспроизводит :

+--------------+ 
|  Col1  | 
+--------------+ 
| TEST01  | 
| -TEST02  | 
| ----LAB  | 
| ----STL40 | 
| -TEST03  | 
| ----LABSTL | 
| ----STLSCH40 | 
| -TEST04  | 
| ----FLG41 | 
| ----LABSTL | 
| ----STLSCH40 | 
+--------------+ 

... Но он делает предположение, что максимальная глубина любого родителя равна 2 (в соответствии с примером). Если вы пойдете глубже, чем это, и вы не знаете, насколько глубоко это происходит, вам нужно будет использовать динамический SQL для получения аналогичного результата. Отметим, что я ответил на аналогичный вопрос по этой ссылке в следующей ссылке, если вы хотите посмотреть, как создать список HTML в качестве вывода из родительской/дочерней таблицы: https://stackoverflow.com/a/34445701/5552667

Смежные вопросы