Во-первых, образцы операторов DDL / DML:
CREATE TABLE t (ID INT, [Table] VARCHAR(5), [Key] varchar(6), Value varchar(5))
INSERT INTO t VALUES (221, 'Tab1', 'Field2', 'Jon'),
(221 ,'Tab1','Field5','Snow'),
(221 ,'Tab1','Field4','Male'),
(221 ,'Tab1','Field3','Pass'),
(2256,'Tab1','Field2','Jil '),
(2256,'Tab1','Field5','Dark')
Статический сводный запрос с жестко закодированными столбцами выглядит следующим образом:
SELECT *
FROM t
PIVOT (MAX(Value) FOR [Key] IN ([Field1], [Field2], [Field3], [Field4], [Field5], [Field6]))p
Возвращает:
ID Table Field1 Field2 Field3 Field4 Field5 Field6
221 Tab1 NULL Jon Pass Male Snow NULL
2256 Tab1 NULL Jil NULL NULL Dark NULL
Если вам нужно динамически определять столбцы из данных, вот подход с использованием sp_executesql:
DECLARE @sql NVARCHAR(MAX)
SELECT @sql = N'
SELECT p.*
FROM t
PIVOT (MAX(Value) FOR [Key] IN (' +
STUFF((SELECT DISTINCT ',' + QUOTENAME([Key]) FROM t FOR XML PATH('')), 1, 1, '') + '))p
'
EXEC sp_executesql @sql
Возвращает:
ID Table Field2 Field3 Field4 Field5
221 Tab1 Jon Pass Male Snow
2256 Tab1 Jil NULL NULL Dark
Эта строка:
SELECT STUFF((SELECT DISTINCT ',' + QUOTENAME([Key]) FROM t FOR XML PATH('')), 1, 1, '')
только заключает в скобки и разделяет столбцы в этой строке:
[Field2],[Field3],[Field4],[Field5]