Du forsøger at PIVOT
dataene. SQL-serveren har en PIVOT
funktion, der kan udføre dette for dig. For at udføre PIVOT
du skal beslutte, hvilken aggregeret funktion du skal bruge. I mit eksempel brugte jeg MAX()
men du kan bruge SUM()
osv.
Hvis du ikke har en pivotfunktion, kan du bruge en aggregeret funktion med en CASE
erklæring for at gøre dette.
Aggregeret/CASE-version: Denne version kræver, at du hårdkoder alle navnene i kolonnerne.
vælg 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) Risici, max(case when name ='People' then rating end) People from your table
Statisk PIVOT-version: Du vil hårdkode værdierne af navnene i denne forespørgsel
vælg *from( vælg navn, vurdering fra dit bord) srcpivot( max(rating) for navn i ([Engineering], [Financials], [Scope], [Schedule], [Risici], [People] )) piv
Ovenstående versioner fungerer godt, hvis du har et kendt antal kolonner, men hvis dit navn
værdier er ukendte, så kan du bruge dynamisk sql til at PIVOT
dataene.
Dynamisk PIVOT-version:
ERKLÆR @cols SOM NVARCHAR(MAX), @query AS NVARCHAR(MAX)vælg @cols =TING((SELECT distinct ',' + QUOTENAME(Name) from yourtable FOR XML PATH(''), TYPE ).value('.', 'NVARCHAR(MAX)') ,1,1,'')set @query ='SELECT ' + @cols + ' fra (vælg navn, vurdering fra din tabel) x pivot (max(rating) ) for navn i (' + @cols + ') ) p 'execute(@query)
Alle tre versioner vil give det samme resultat:
| INGENIØR | ØKONOMI | OMFANG | TIDSPLAN | RISICI | MENNESKER |------------------------------------------------ ----------------| 1 | 3 | 1 | 2 | 3 | 3 |