sql >> Databasteknik >  >> RDS >> Sqlserver

Konvertera resultatet av en kolumn till en enda rad

Du försöker PIVOT uppgifterna. SQL-servern har en PIVOT funktion som kan utföra detta åt dig. För att utföra PIVOT du måste bestämma vilken aggregatfunktion som ska användas. I mitt exempel använde jag MAX() men du kan använda SUM() , etc.

Om du inte har en pivotfunktion kan du använda en aggregatfunktion med en CASE uttalande att göra detta.

Aggregerad/CASE-version: Den här versionen kräver att du hårdkodar alla namn i kolumnerna.

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

Se SQL-fiol med demo

Statisk PIVOT-version: Du kommer att hårdkoda namnens värden i den här frågan

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

Se SQL-fiol med demo

Ovanstående versioner fungerar utmärkt om du har ett känt antal kolumner, men om ditt namn värden är okända, då kan du använda dynamisk sql för att PIVOT uppgifterna.

Dynamisk 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)

Se SQL-fiol med demo

Alla tre versionerna kommer att ge samma resultat:

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



  1. Dela en mycket stor sträng med en anpassad avgränsare?

  2. Postgresql:FÖRBERED TRANSAKTION

  3. Saknar artefakt com.microsoft.sqlserver:sqljdbc4:jar:4.0

  4. återanvända resultatet av ett urvalsuttryck i GROUP BY-satsen?