Для перестановки строк и столбцов, необходимо UNPIVOT
(преобразовать столбцы в значение строк), а затем PIVOT
(строки в столбцы) на основе результата UNPIVOT
.
-- Here is the result
SELECT * FROM
(
-- Unpivot here using CROSS APPLY
SELECT [Group],
[Values],COLNAMES
FROM YOURTABLE
CROSS APPLY(VALUES (Value1,'Value1'),(Value2,'Value2'),(Value3,'Value3'))
AS COLUMNNAMES([Values],COLNAMES)
)TAB
PIVOT
(
-- Specify the values to hold in pivoted column
MIN([Values])
-- Specify the name of columns
FOR [Group] IN([A],[B],[C])
)P
ORDER BY COLNAMES
ОБРАБОТКА ЗАПРОСА
Вы можете использовать CROSS APPLY
для UNPIVOT
. Value1
будут столбцами, которые содержат значения в столбце - Value1
. 'Value1'
(в одиночных кавычках) будет трудно закодированное значение имени столбца (который показан на COLNAMES
переменном. Использование CROSS APPLY
будет генерировать следующий результат.
Теперь с данными, полученными от CROSS APPLY
, вы отправитесь в PIVOT
, который образует следующий результат.
Иногда вы не можете знать значения в столбце Group
заранее. В таком случае вам необходимо использовать Dynamic Sql
.Первым шагом в этом является получение значений в строке Group
переменной.
DECLARE @cols NVARCHAR (MAX)
SELECT @cols = STUFF((SELECT ',' + QUOTENAME([Group])
FROM
(
SELECT distinct [Group] from YOURTABLE
) c
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,1,'')
Теперь используйте PIVOT
запрос с Dynamic Sql
. Почему мы используем Dynamic Sql
, потому что Sql Server
не может получить имена столбцов из переменной, если только и не используется Dynamic Sql
.
DECLARE @query NVARCHAR(MAX)
SET @query = '
SELECT * FROM
(
-- Unpivot here using CROSS APPLY
SELECT [Group],
[Values],COLNAMES
FROM YOURTABLE
CROSS APPLY(VALUES (Value1,''Value1''),(Value2,''Value2''),(Value3,''Value3''))
AS COLUMNNAMES([Values],COLNAMES)
) x
PIVOT
(
-- Specify the values to hold in pivoted column
MIN([Values])
-- Get the column names from variable
FOR [Group] IN('[email protected]+')
) p
ORDER BY COLNAMES;'
EXEC SP_EXECUTESQL @query
Надеюсь, вы понимаете понятия и получили результат.
Любые разъяснения, не стесняйтесь спрашивать.
[Поиск на этом сайте в одиночку ......] (http://stackoverflow.com/search?q=sql+server+convert+row+to+column) дает ** 697 ответов ** ... .. –
строка для столбца и столбца для строки. это мой вопрос на самом деле. Как его сочетать? – Haminteu