Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Convertendo os resultados de uma coluna em uma única linha


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 |