У меня есть существующая таблица со следующими данными:
InputName ResolvedName Type InsertDate
Server_1 Cluster_Alias_1 ABC 9/13/2018 7:47:19 PM
Server_2 Cluster_Alias_1 ABC 9/13/2018 7:47:19 PM
Server_3 Cluster_Alias_1 ABC 9/13/2018 7:47:19 PM
Server_4 Cluster_Alias_1 ABC 9/13/2018 7:47:19 PM
Server_5 Cluster_Alias_1 ABC 9/18/2018 1:55:12 PM
Server_6 Cluster_Alias_1 ABC 9/18/2018 1:55:12 PM
Server_7 Cluster_Alias_1 ABC 9/13/2018 7:47:19 PM
Server_8 Cluster_Alias_1 ABC 9/13/2018 7:47:19 PM
Server_9 Cluster_Alias_1 ABC 9/13/2018 7:47:19 PM
Server_10 Cluster_Alias_1 ABC 9/13/2018 7:47:19 PM
И я пытаюсь использовать SQL Pivot, чтобы он выглядел так:
ResolvedName InputName1 InputName2 InputName3 InputName4 InputName5 InputName6 InputName7 InputName8 InputName9 InputName10
Cluster_Alias_1 Server_1 Server_2 Server_3 Server_4 Server_5 Server_6 Server_7 Server_8 Server_9 Server_10
Я просмотрел несколько решений, и все связано с поворотом числа, но все относится к числу, а не к строке.
Ссылки, которые я пробовал:
https://www.sqlshack.com/multiple-options-to-transpose-rows-into-columns/
Преобразование строк в столбцы с помощью «Pivot» в SQL Server





Не совсем уверен, но я думаю, вы ищете что-то вроде ниже-
SELECT ResolvedName,
MAX(CASE WHEN InputName = 'Server_1' THEN InputName ELSE NULL END) InputName1,
MAX(CASE WHEN InputName = 'Server_2' THEN InputName ELSE NULL END) InputName2,
MAX(CASE WHEN InputName = 'Server_3' THEN InputName ELSE NULL END) InputName3,
MAX(CASE WHEN InputName = 'Server_4' THEN InputName ELSE NULL END) InputName4,
MAX(CASE WHEN InputName = 'Server_5' THEN InputName ELSE NULL END) InputName5,
MAX(CASE WHEN InputName = 'Server_6' THEN InputName ELSE NULL END) InputName6,
MAX(CASE WHEN InputName = 'Server_7' THEN InputName ELSE NULL END) InputName7,
MAX(CASE WHEN InputName = 'Server_8' THEN InputName ELSE NULL END) InputName8,
MAX(CASE WHEN InputName = 'Server_9' THEN InputName ELSE NULL END) InputName9,
MAX(CASE WHEN InputName = 'Server_10' THEN InputName ELSE NULL END) InputName10
FROM your_table
GROUP BY ResolvedName
Если вам не нужно делать это динамически на основе количества входов, вам нужно просто создать имена столбцов, используя row_number, и повернуть на основе комбинированного имени «InputName» + row_number
Что-то типа:
select *
from (
select ResolvedName,
InputName,
concat('InputName',row_number() over (partition by ResolvedName order by InputName)) ColumnNames
from [table]
) t
pivot (
max(InputName)
for ColumnNames in ([InputName1],[InputName2],[InputName3],[InputName4],[InputName5],[InputName6],[InputName7],[InputName8])
) p
Вы можете попробовать это для динамического запроса.
DECLARE @cols AS NVARCHAR(MAX),
@query AS NVARCHAR(MAX)
select @cols = STUFF((SELECT ',' + concat('InputName',row_number() over (partition by ResolvedName order by InputName))
from [table]
group by ResolvedName
order by ResolvedName
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,1,'')
set @query = 'select *
from (
select ResolvedName,
InputName,
concat(''InputName'',row_number() over (partition by ResolvedName order by InputName)) ColumnNames
from [table]
) t
pivot (
max(InputName)
for ColumnNames in (' + @cols + ')
) p'
execute(@query);
вы также можете использовать
dynamic sql, чтобы сделать его более гибким. Прямо сейчас он привязан к 10 серверу.