Sie können die UNPIVOT-Funktion verwenden, um die Spalten in Zeilen umzuwandeln:
select id, entityId,
indicatorname,
indicatorvalue
from yourtable
unpivot
(
indicatorvalue
for indicatorname in (Indicator1, Indicator2, Indicator3)
) unpiv;
Beachten Sie, dass die Datentypen der Spalten, die Sie entpivotieren, identisch sein müssen, sodass Sie möglicherweise die Datentypen konvertieren müssen, bevor Sie die Entpivotierung anwenden.
Sie können auch CROSS APPLY
verwenden mit UNION ALL um die Spalten zu konvertieren:
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);
Abhängig von Ihrer Version von SQL Server können Sie sogar CROSS APPLY mit der VALUES-Klausel verwenden:
select id, entityid,
indicatorname,
indicatorvalue
from yourtable
cross apply
(
values
('Indicator1', Indicator1),
('Indicator2', Indicator2),
('Indicator3', Indicator3),
('Indicator4', Indicator4)
) c (indicatorname, indicatorvalue);
Wenn Sie schließlich 150 Spalten zum Entpivotieren haben und nicht die gesamte Abfrage fest codieren möchten, können Sie die SQL-Anweisung mit dynamischem SQL generieren:
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;