Você está tentando
PIVOT
os dados. O servidor SQL tem um PIVOT
função que pode fazer isso para você. Para executar o PIVOT
você precisa decidir qual função agregada usar. No meu exemplo, usei MAX()
mas você pode usar SUM()
, etc Se você não tiver uma função pivô, poderá usar uma função agregada com um
CASE
declaração para fazer isso. Versão agregada/CASE: Esta versão requer que você codifique todos os nomes nas colunas.
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 with Demo
Versão do pivô estático: Você irá codificar os valores dos nomes nesta 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 with Demo
As versões acima funcionam muito bem se você tiver um número conhecido de colunas, mas se seu
nome
valores são desconhecidos, então você pode usar sql dinâmico para PIVOT
os dados. Versão Dinâmica PIVOT:
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 with Demo
Todas as três versões produzirão o mesmo resultado:
| ENGINEERING | FINANCIALS | SCOPE | SCHEDULE | RISKS | PEOPLE |
----------------------------------------------------------------
| 1 | 3 | 1 | 2 | 3 | 3 |