Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Konvertieren der Ergebnisse einer Spalte in eine einzelne Zeile

Sie versuchen PIVOT die Daten. Der SQL-Server hat einen PIVOT Funktion, die dies für Sie ausführen kann. Um den PIVOT auszuführen Sie müssen entscheiden, welche Aggregatfunktion verwendet werden soll. In meinem Beispiel habe ich MAX() verwendet aber Sie können SUM() verwenden usw.

Wenn Sie keine Pivot-Funktion haben, können Sie eine Aggregatfunktion mit einem CASE verwenden Anweisung dazu.

Gesamt-/CASE-Version: Diese Version erfordert, dass Sie alle Namen fest in die Spalten codieren.

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

Siehe SQL Fiddle mit Demo

Statische PIVOT-Version: Sie werden die Werte der Namen fest in diese Abfrage codieren

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

Siehe SQL-Fiddle mit Demo

Die obigen Versionen funktionieren hervorragend, wenn Sie eine bekannte Anzahl von Spalten haben, aber wenn Ihr name Werte sind unbekannt, dann können Sie dynamisches SQL zum PIVOT verwenden die Daten.

Dynamische PIVOT-Version:

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)

Siehe SQL-Geige mit Demo

Alle drei Versionen führen zum gleichen Ergebnis:

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