Можете да използвате функцията 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;