Это можно сделать с помощью функции PIVOT. Я попробую разработать пример:
SELECT *
FROM ERAUser.Audit
PIVOT (max(NewValue) FOR FieldName in (Field1, Field2, Field3)) as PivotTable
Функция max () необходима для указания Sql Server, что делать, если он находит несколько строк с одним и тем же FieldName. Вы можете использовать оператор WHERE, чтобы ограничить его правильными строками; если вы убедитесь, что он находит только одно значение, max (NewValue) равно NewValue.
Вы можете сгенерировать SQL для этого, если у вас длинный список столбцов:
declare @columnlist nvarchar(4000)
select @columnlist = IsNull(@columnlist + ', ', '') + FieldName
from (
select distinct FieldName from ERAUser.Audit
) sub
declare @query nvarchar(4000)
select @query = 'select *
from ERAUser.Audit
PIVOT (max(newValue) FOR FieldName in (' + @columnlist + ')) as PivotTable'
exec sp_executesql @query
Вот базовый пример PIVOT, чтобы получить общее представление:
create table #normalized (
colname varchar(12),
value varchar(12)
)
insert into #normalized values ('value1','A')
insert into #normalized values ('value2','B')
insert into #normalized values ('value3','C')
select *
from #normalized
PIVOT (max(value) FOR ColName in (value1,value2,value3)) as Y
Это приведет к:
value1 value2 value3
A B C