sql >> Databasteknik >  >> RDS >> Sqlserver

SQL Server:Kolumner till rader

Du kan använda UNPIVOT-funktionen för att konvertera kolumnerna till rader:

select id, entityId,
  indicatorname,
  indicatorvalue
from yourtable
unpivot
(
  indicatorvalue
  for indicatorname in (Indicator1, Indicator2, Indicator3)
) unpiv;

Observera att datatyperna för kolumnerna du avpivoterar måste vara desamma, så du kan behöva konvertera datatyperna innan du tillämpar unpivoten.

Du kan också använda CROSS APPLY med UNION ALL för att konvertera kolumnerna:

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);

Beroende på din version av SQL Server kan du till och med använda CROSS APPLY med VALUES-satsen:

select id, entityid,
  indicatorname,
  indicatorvalue
from yourtable
cross apply
(
  values
  ('Indicator1', Indicator1),
  ('Indicator2', Indicator2),
  ('Indicator3', Indicator3),
  ('Indicator4', Indicator4)
) c (indicatorname, indicatorvalue);

Slutligen, om du har 150 kolumner att avpivotera och du inte vill hårdkoda hela frågan, kan du generera SQL-satsen med 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;


  1. SQL Server LIKE som innehåller hakparenteser

  2. Hur man övervakar MySQL-distributioner med Prometheus &Grafana på ScaleGrid

  3. Enkel Oracle-fråga:literal matchar inte formatsträngen

  4. Hämta veckostartdatum och veckoslutdatum från veckonummer