Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

SQL Server:Spalten zu Zeilen

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;