Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

SQL Server :colonnes vers lignes

Vous pouvez utiliser la fonction UNPIVOT pour convertir les colonnes en lignes :

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

Notez que les types de données des colonnes dont vous annulez le pivot doivent être les mêmes, vous devrez donc peut-être convertir les types de données avant d'appliquer l'unpivot.

Vous pouvez également utiliser CROSS APPLY avec UNION ALL pour convertir les colonnes :

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

Selon votre version de SQL Server, vous pouvez même utiliser CROSS APPLY avec la clause VALUES :

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

Enfin, si vous avez 150 colonnes à annuler et que vous ne souhaitez pas coder en dur l'intégralité de la requête, vous pouvez générer l'instruction sql à l'aide de SQL dynamique :

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;