Вы можете использовать функцию UNPIVOT для преобразования столбцов в строки:
select id, entityId,
indicatorname,
indicatorvalue
from yourtable
unpivot
(
indicatorvalue
for indicatorname in (Indicator1, Indicator2, Indicator3)
) unpiv;
Обратите внимание, что типы данных столбцов, которые вы отменяете, должны быть одинаковыми, поэтому вам, возможно, придется преобразовать типы данных перед применением отмены.
Вы также можете использовать CROSS APPLY
UNION ALL для преобразования столбцов:
select id, entityid,
indicatorname,
indicatorvalue
from yourtable
cross apply
(
select 'Indicator1', Indicator1 union all
select 'Indicator2', Indicator2 union all
select 'Indicator3', Indicator3 union all
select 'Indicator4', Indicator4
) c (indicatorname, indicatorvalue);
В зависимости от вашей версии SQL Server вы даже можете использовать CROSS APPLY с предложением VALUES:
select id, entityid,
indicatorname,
indicatorvalue
from yourtable
cross apply
(
values
('Indicator1', Indicator1),
('Indicator2', Indicator2),
('Indicator3', Indicator3),
('Indicator4', Indicator4)
) c (indicatorname, indicatorvalue);
Наконец, если у вас есть 150 столбцов, которые нужно развернуть, и вы не хотите жестко кодировать весь запрос, вы можете сгенерировать оператор sql, используя динамический SQL:
DECLARE @colsUnpivot AS NVARCHAR(MAX),
@query AS NVARCHAR(MAX)
select @colsUnpivot
= stuff((select ','+quotename(C.column_name)
from information_schema.columns as C
where C.table_name = 'yourtable' and
C.column_name like 'Indicator%'
for xml path('')), 1, 1, '')
set @query
= 'select id, entityId,
indicatorname,
indicatorvalue
from yourtable
unpivot
(
indicatorvalue
for indicatorname in ('+ @colsunpivot +')
) u'
exec sp_executesql @query;