Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Conversione dei risultati di una colonna in una singola riga

Stai cercando di PIVOT i dati. Il server SQL ha un PIVOT funzione che può eseguire questo per te. Per eseguire il PIVOT è necessario decidere quale funzione di aggregazione utilizzare. Nel mio campione, ho usato MAX() ma puoi usare SUM() , ecc.

Se non disponi di una funzione pivot, puoi utilizzare una funzione aggregata con un CASE dichiarazione per farlo.

Versione aggregata/CASE: Questa versione richiede di codificare tutti i nomi nelle colonne.

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

Vedi SQL Fiddle con demo

Versione PIVOT statica: Codificherai i valori dei nomi in questa query

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

Vedi SQL Fiddle con demo

Le versioni precedenti funzionano alla grande se hai un numero noto di colonne, ma se il tuo name i valori sono sconosciuti, quindi puoi utilizzare sql dinamico per PIVOT i dati.

Versione dinamica 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)

Vedi SQL Fiddle con demo

Tutte e tre le versioni produrranno lo stesso risultato:

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