Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Conversion des résultats d'une colonne en une seule ligne

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 |