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 |