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

Convertir los resultados de una columna en una sola fila

Está intentando PIVOT los datos. El servidor SQL tiene un PIVOT función que puede realizar esto por usted. Para realizar el PIVOT debe decidir qué función agregada usar. En mi muestra, usé MAX() pero puedes usar SUM() , etc

Si no tiene una función pivote, puede usar una función agregada con un CASE declaración para hacer esto.

Versión agregada/CASE: Esta versión requiere que codifique todos los nombres en las columnas.

select 
  max(case when name = 'Engineering' then rating end) Engineering,
  max(case when name = 'Financials' then rating end) Financials,
  max(case when name = 'Scope' then rating end) Scope,
  max(case when name = 'Schedule' then rating end) Schedule,
  max(case when name = 'Risks' then rating end) Risks,
  max(case when name = 'People' then rating end) People
from yourtable

Consulte SQL Fiddle con demostración

Versión PIVOT estática: Codificará los valores de los nombres en esta consulta

select *
from
(
  select name, rating
  from yourtable
) src
pivot
(
  max(rating)
  for name in ([Engineering], [Financials], [Scope],
               [Schedule], [Risks], [People])
) piv

Consulte SQL Fiddle con demostración

Las versiones anteriores funcionan muy bien si tiene un número conocido de columnas, pero si su name los valores son desconocidos, entonces puede usar sql dinámico para PIVOT los datos.

Versión PIVOT dinámica:

DECLARE @cols AS NVARCHAR(MAX),
    @query  AS NVARCHAR(MAX)

select @cols = STUFF((SELECT distinct ',' + QUOTENAME(Name) 
                    from yourtable
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')

set @query = 'SELECT ' + @cols + ' from 
             (
                select name, rating
                from yourtable
            ) x
            pivot 
            (
                max(rating)
                for name in (' + @cols + ')
            ) p '

execute(@query)

Consulte SQL Fiddle con demostración

Las tres versiones producirán el mismo resultado:

| ENGINEERING | FINANCIALS | SCOPE | SCHEDULE | RISKS | PEOPLE |
----------------------------------------------------------------
|           1 |          3 |     1 |        2 |     3 |      3 |