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
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
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)
Alla tre versionerna kommer att ge samma resultat:
| ENGINEERING | FINANCIALS | SCOPE | SCHEDULE | RISKS | PEOPLE |
----------------------------------------------------------------
| 1 | 3 | 1 | 2 | 3 | 3 |