Чтобы получить все родительские или дочерние элементы, эффективно использовать рекурсивную функцию, которая будет извлекать всю иерархию.
Пример таблицы:
CREATE TABLE #TEST
(
[Name] varchar(100),
ManagerName Varchar(100),
Number int
)
Вставить некоторые значения
Insert into Test values
('a','b'), ('b','c'), ('c','d'), ('d','e'), ('e','f'), ('f','g')
Создать рекурсивную функцию, как показано ниже
CREATE FUNCTION [dbo].[fnRecursive] (@EmpName Varchar(100), @incremental int)
RETURNS @ret TABLE
(
ManagerName varchar(100),
Number int
)
AS
BEGIN
Declare @MgrName varchar(100)
SET @MgrName = (Select ManagerName from test where [name] = @EmpName)
Insert into @ret values (@MgrName, @incremental)
if(@MgrName is not null)
BEGIN
SET @incremental = @incremental + 1;
Insert into @ret
Select ManagerName, Number from [fnRecursive](@MgrName, @incremental)
END
RETURN;
END
Если эта функция объединена с таблицей, она должна перечислить иерархию для всех сотрудников
CREATE TABLE #TEST
(
[Name] varchar(100),
ManagerName Varchar(100),
Number int
)
Insert into #TEST
Select x.[Name], x.ManagerName,x.number from (
select t.[Name],a.ManagerName as managerName, a.number as number from TEST t outer apply
(
select * from [fnRecursive](t.[Name],1)
) a)
x
Select * from #Test
Если мы делаем сводкуна столе (исключая столбец «Номер»).Предполагая, что мы храним в таблице «#temp», в нем должны быть перечислены все менеджеры в виде столбца.
DECLARE @cols AS NVARCHAR(MAX),
@query AS NVARCHAR(MAX);
SET @cols = STUFF((SELECT distinct ',' + QUOTENAME(c.[ManagerName] )
FROM #temp c
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,1,'')
set @query = 'select * from #temp
pivot
(
min([managername])
for managername in (' + @cols + ')
) p '
execute(@query)
Но вместо этого столбец не называется «Parent1», «Parent2» вместо динамического столбца.name.
Ссылка ниже должна помочь установить имя настраиваемого столбца для динамической сводной таблицы
https://stackoverflow.com/questions/16614994/sql-server-pivot-with-custom-column-names