Du kan bruge UNPIVOT-funktionen til at konvertere kolonnerne til rækker:
select id, entityId,
indicatorname,
indicatorvalue
from yourtable
unpivot
(
indicatorvalue
for indicatorname in (Indicator1, Indicator2, Indicator3)
) unpiv;
Bemærk, datatyperne for de kolonner, du deaktiverer, skal være de samme, så du skal muligvis konvertere datatyperne, før du anvender unpivoten.
Du kan også bruge CROSS APPLY
med UNION ALL for at konvertere kolonnerne:
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);
Afhængigt af din version af SQL Server kan du endda bruge CROSS APPLY med VALUES-sætningen:
select id, entityid,
indicatorname,
indicatorvalue
from yourtable
cross apply
(
values
('Indicator1', Indicator1),
('Indicator2', Indicator2),
('Indicator3', Indicator3),
('Indicator4', Indicator4)
) c (indicatorname, indicatorvalue);
Til sidst, hvis du har 150 kolonner, der skal deaktiveres, og du ikke ønsker at hardkode hele forespørgslen, kan du generere sql-sætningen ved hjælp af dynamisk 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;