Anda mencoba untuk PIVOT
data. SQL server memiliki PIVOT
fungsi yang dapat melakukan ini untuk Anda. Untuk melakukan PIVOT
Anda perlu memutuskan fungsi agregat apa yang akan digunakan. Dalam sampel saya, saya menggunakan MAX()
tetapi Anda dapat menggunakan SUM()
, dll.
Jika Anda tidak memiliki fungsi pivot maka Anda dapat menggunakan fungsi agregat dengan CASE
pernyataan untuk melakukan ini.
Versi Agregat/KASUS: Versi ini mengharuskan Anda mengkodekan semua nama ke dalam kolom.
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
Lihat SQL Fiddle dengan Demo
Versi PIVOT statis: Anda akan membuat kode nilai dari nama-nama tersebut ke dalam kueri ini
select *
from
(
select name, rating
from yourtable
) src
pivot
(
max(rating)
for name in ([Engineering], [Financials], [Scope],
[Schedule], [Risks], [People])
) piv
Lihat SQL Fiddle dengan Demo
Versi di atas berfungsi dengan baik jika Anda memiliki jumlah kolom yang diketahui, tetapi jika name
. Anda nilainya tidak diketahui, maka Anda dapat menggunakan sql dinamis untuk PIVOT
datanya.
Versi PIVOT Dinamis:
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)
Lihat SQL Fiddle dengan Demo
Ketiga versi akan menghasilkan hasil yang sama:
| ENGINEERING | FINANCIALS | SCOPE | SCHEDULE | RISKS | PEOPLE |
----------------------------------------------------------------
| 1 | 3 | 1 | 2 | 3 | 3 |