Vous essayez de PIVOT
les données. Le serveur SQL a un PIVOT
fonction qui peut effectuer cela pour vous. Pour effectuer le PIVOT
vous devez décider quelle fonction d'agrégation utiliser. Dans mon exemple, j'ai utilisé MAX()
mais vous pouvez utiliser SUM()
, etc.
Si vous n'avez pas de fonction pivot, vous pouvez utiliser une fonction d'agrégation avec un CASE
déclaration pour ce faire.
Version agrégée/CASE : Cette version nécessite que vous codiez en dur tous les noms dans les colonnes.
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
Voir SQL Fiddle avec démo
Version PIVOT statique : Vous allez coder en dur les valeurs des noms dans cette requête
select *
from
(
select name, rating
from yourtable
) src
pivot
(
max(rating)
for name in ([Engineering], [Financials], [Scope],
[Schedule], [Risks], [People])
) piv
Voir SQL Fiddle avec démo
Les versions ci-dessus fonctionnent très bien si vous avez un nombre connu de colonnes, mais si votre name
les valeurs sont inconnues, vous pouvez utiliser sql dynamique pour PIVOT
les données.
Version PIVOT dynamique :
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)
Voir SQL Fiddle avec démo
Les trois versions produiront le même résultat :
| ENGINEERING | FINANCIALS | SCOPE | SCHEDULE | RISKS | PEOPLE |
----------------------------------------------------------------
| 1 | 3 | 1 | 2 | 3 | 3 |