Masalah dengan kueri Anda saat ini adalah dengan baris:
MAX(SERVER_ID)
Anda ingin menampilkan PROPERTY_CHAR_VAL
untuk setiap PROPERTY_NAME
alih-alih. SERVER_ID
akan menjadi bagian dari hasil akhir sebagai kolom.
Terkadang ketika Anda bekerja dengan PIVOT lebih mudah untuk menulis kode terlebih dahulu dengan nilai-nilai hard-coded yang mirip dengan:
select id, name1, name2, name3, name4
from
(
select id, property_name, property_value
from yourtable
) d
pivot
(
max(property_value)
for property_name in (name1, name2, name3, name4)
) piv;
Lihat SQL Fiddle dengan Demo .
Setelah Anda memiliki versi yang memiliki logika yang benar, Anda dapat mengubahnya menjadi SQL dinamis untuk mendapatkan hasilnya. Ini akan membuat string sql yang akan dieksekusi dan akan menyertakan semua nama kolom baru Anda.
DECLARE @cols AS NVARCHAR(MAX),
@query AS NVARCHAR(MAX)
select @cols = STUFF((SELECT distinct ',' + QUOTENAME(PROPERTY_NAME)
from yourtable
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,1,'')
set @query = 'SELECT id, ' + @cols + '
from
(
select id, property_name, property_value
from yourtable
) x
pivot
(
max(property_value)
for property_name in (' + @cols + ')
) p '
execute sp_executesql @query;
Lihat SQL Fiddle dengan Demo . Keduanya akan memberikan hasil:
| ID | NAME1 | NAME2 | NAME3 | NAME4 | NAME6 |
|----|--------|--------|--------|--------|--------|
| 1 | value | value | value | (null) | (null) |
| 2 | (null) | value | (null) | value | (null) |
| 3 | (null) | (null) | (null) | (null) | value |