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 |