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 |