Problem z aktualnym zapytaniem dotyczy linii:
MAX(SERVER_ID)
Chcesz wyświetlić PROPERTY_CHAR_VAL
dla każdej PROPERTY_NAME
zamiast. SERVER_ID
będzie częścią końcowego wyniku jako kolumna.
Czasami, gdy pracujesz z PIVOT, łatwiej jest najpierw napisać kod z wartościami zakodowanymi na stałe, podobnymi do:
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;
Zobacz SQL Fiddle z wersją demonstracyjną .
Gdy masz wersję, która ma poprawną logikę, możesz przekonwertować ją na dynamiczny SQL, aby uzyskać wynik. Spowoduje to utworzenie ciągu sql, który zostanie wykonany i będzie zawierał wszystkie nowe nazwy kolumn.
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;
Zobacz SQL Fiddle z wersją demonstracyjną . Oba dadzą wynik:
| ID | NAME1 | NAME2 | NAME3 | NAME4 | NAME6 |
|----|--------|--------|--------|--------|--------|
| 1 | value | value | value | (null) | (null) |
| 2 | (null) | value | (null) | value | (null) |
| 3 | (null) | (null) | (null) | (null) | value |