CringTee Ответов: 2

Получение иерархических табличных данных в виде простого табличного формата для отчета? Помогите, пожалуйста!


Уважаемые эксперты,
У меня есть иерархическая таблица, которая хранит данные, как показано ниже,в базе данных SQL Server 2008.
ID	Description	Category	ParentID
1	ABC	       Objective	 NULL
2	CDE	       Objective	 NULL
3	XXX	       Objective	 NULL
4	YYY	       Criteria	     1
5	DDD	       Criteria	     1
6	AAA	       Criteria      2
7	CCC	       Procedure     4
8	EEEE	   Procedure     4
9	JJJJ	   Procedure     6

А теперь я хочу написать книгу. Хранимая процедура чтобы получить данные из вышеприведенной иерархической таблицы в формате ниже (рис. 2):
Objective	Criteria	Procedure
ABC	         YYY	     CCC
ABC	         YYY	     ZZZ
CDE	         KKK	     RRRR
CDE	         DDD	     EEEE
XXX	         AAA	     JJJJ

для целей отчета.

ОТРЕДАКТИРОВАННЫЙ:
Я сделал запрос CTE, как показано ниже:
;WITH CteDAP ( ID, HierarchyID, Description, Category_Level, Depth)
	 AS
	 (
			SELECT DISTINCT 
					  A.ID, A.HierarchyID, A.Description, B.Name AS Category_Level,0 AS Depth
			FROM      tblHierarchy A INNER JOIN tblCat_lvl B ON A.fkCat_lvlId = B.pkCat_lvlId 
			WHERE     A.HierarchyID IS NULL
		UNION ALL 		
			SELECT    
					  C.ID, C.HierarchyID, C.Description, D.Name AS Category_Level, (CTE.Depth + 1) AS Depth
			FROM      tblHierarchy C INNER JOIN tblCat_lvl D ON C.fkCat_lvlId = D.pkCat_lvlId INNER JOIN
				  CteDAP CTE ON C.HierarchyID = CTE.ID
	 )
	 SELECT * FROM CteDAP ORDER BY Depth, Description


Получил результат как :
ID HierarchyID	  Description	                    category_Level	    Depth
10	NULL	  Capital Grants…………	                  AOC	            0
11	NULL	  Contributions…………..	                  AOC	            0
15	NULL	  Current Grants …………	                  AOC	            0
20	10	      To ascertain that expenditure…………….	 Overall Objective	1
25	11	      To ascertain that other ……………………….	 Overall Objective	1
26	15	      To ascertain that pay ………………..	     Overall Objective	1
28	20	      To ascertain that …………….	             Sub Objective	    2
30	20	      Ascertain…………..	                     Sub Objective	    2
40	25	      Evaluation of …………….	                 Sub Objective	    2
42	28	      Received should ………..	                 Criteria	        3
43	28	      Received should be ………..	             Criteria	        3
45	40	      All supplies of …………	                 Criteria	        3
50	40	      Annual increments ………………	             Criteria	        3
53	42	      Check from the …………..	                 Procedure	        4
54	42	      Check whether ……………	                 Procedure	        4
59	50	      Check whether it………………	             Procedure	        4
Теперь мне нужны данные (рис. 2) формат.
Любая помощь будет высоко оценена. Спасибо.

Что я уже пробовал:

Я попробовал написать CTE, но не смог добиться нужного формата, динамический POVIT может помочь мне, но я не знаю, как написать динамический POVIT. Помогите, Пожалуйста!

2 Ответов

Рейтинг:
9

CringTee

Решается с помощью CTE и путем ссылки Динамический сводный запрос в SQL Server[^] "Динамический сводный запрос в SQL Server"


Рейтинг:
1

Richard Deeming

Ваши выборочные данные не имеют никакого смысла - цель 3 не имеет критериев, а критерий 5 не имеет процедуры.

Предполагая, что это просто опечатка в вашем вопросе, что-то вроде этого должно сработать:

SELECT
    O.Description As Objective,
    C.Description As Criteria,
    P.Description As [Procedure]
FROM
    YourTable As O
    LEFT JOIN YourTable As C
    ON C.ParentID = O.ID And C.Category = 'Criteria'
    LEFT JOIN YourTable As P
    ON P.ParentID = C.ID And P.Category = 'Procedure'
WHERE
    O.ParentID Is Null
;

С вашими образцовыми данными это приводит к следующему результату:
Objective    Criteria    Procedure
ABC          YYY         CCC  
ABC          YYY         EEEE 
ABC          DDD         <NULL>
CDE          AAA         JJJJ 
XXX          <NULL>      <NULL>


CringTee

Поскольку это иерархическая таблица, то будет n дочерних элементов, а может и не быть. Данные в моем вопросе - это всего лишь примерные данные, которые могут помочь понять вопрос. n количество дочерних данных будет иметь имя уровня (категорию), как в моем примере "цель, критерии, процедура, подпроцедура и т. д.". таким образом, мы не можем сделать "на C. ParentID = O.ID и C. Category = 'Criteria'", она должна быть динамичной.

Richard Deeming

Мой ответ уже касается случая, когда одна цель имеет несколько критериев и когда один критерий имеет несколько процедур.

Если это не то, что вы хотите, то вам нужно обновить свой вопрос с четким и точным описанием того, что вы хотите. делать хотеть. Предоставьте четкую выборку входных данных, выходных данных и того, как они связаны.

Помните, что мы не можем видеть ваш экран, получить доступ к вашему компьютеру или прочитать ваши мысли. Если вы не скажете нам точно, чего хотите, мы не сможем вам помочь.

CringTee

- Спасибо, Сэр. Я обновил вопрос, как вы рекомендовали, если он имеет фиксированное количество дочерних данных, то да, ваше решение поможет решить эту проблему. Но мои данные будут иметь N-число детей.