sql >> Base de Datos >  >> RDS >> Sqlserver

SQL Server:columnas a filas

Puede usar la función UNPIVOT para convertir las columnas en filas:

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

Tenga en cuenta que los tipos de datos de las columnas que está eliminando de la dinámica deben ser los mismos, por lo que es posible que deba convertir los tipos de datos antes de aplicar la eliminación de la dinámica.

También podría usar CROSS APPLY con UNION ALL para convertir las columnas:

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

Dependiendo de su versión de SQL Server, incluso podría usar CROSS APPLY con la cláusula VALUES:

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

Finalmente, si tiene 150 columnas para anular el pivote y no desea codificar la consulta completa, entonces puede generar la instrucción sql usando SQL dinámico:

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;