Le problème avec votre requête actuelle est avec la ligne :
MAX(SERVER_ID)
Vous souhaitez afficher le PROPERTY_CHAR_VAL
pour chaque PROPERTY_NAME
Au lieu. Le SERVER_ID
fera partie du résultat final sous forme de colonne.
Parfois, lorsque vous travaillez avec PIVOT, il est plus facile d'écrire d'abord le code avec des valeurs codées en dur similaires à :
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;
Voir SQL Fiddle avec démo .
Une fois que vous avez une version qui a la bonne logique, vous pouvez la convertir en SQL dynamique pour obtenir le résultat. Cela créera une chaîne sql qui sera exécutée et qui inclura tous vos nouveaux noms de colonnes.
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;
Voir SQL Fiddle avec démo . Les deux donneront un résultat :
| ID | NAME1 | NAME2 | NAME3 | NAME4 | NAME6 |
|----|--------|--------|--------|--------|--------|
| 1 | value | value | value | (null) | (null) |
| 2 | (null) | value | (null) | value | (null) |
| 3 | (null) | (null) | (null) | (null) | value |