Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Valeurs de colonne de pivot dynamique MSSQL vers l'en-tête de colonne

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 |