sql >> Database >  >> RDS >> Sqlserver

SQL Server:kolommen naar rijen

U kunt de functie UNPIVOT gebruiken om de kolommen in rijen om te zetten:

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

Houd er rekening mee dat de gegevenstypen van de kolommen die u ongedaan maakt, hetzelfde moeten zijn, dus het kan zijn dat u de gegevenstypen moet converteren voordat u de draaibeweging toepast.

U kunt ook CROSS APPLY . gebruiken met UNION ALL om de kolommen te converteren:

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

Afhankelijk van uw versie van SQL Server kunt u zelfs CROSS APPLY gebruiken met de VALUES-clausule:

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

Als u ten slotte 150 kolommen hebt om de draaiing ongedaan te maken en u niet de hele query hard wilt coderen, kunt u de SQL-instructie genereren met dynamische 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. Database naamgevingsconventies door Microsoft?

  2. Verschillende manieren om de SQL CONVERT-datumfunctie te gebruiken

  3. mysql_fetch_row() versus mysql_fetch_assoc() versus mysql_fetch_array()

  4. Registreer en voer PostgreSQL 9.0 uit als Windows-service