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

SQL Server 2008 Données verticales à horizontales

Vous pouvez utiliser la fonction PIVOT pour convertir vos lignes de données en colonnes.

Votre requête d'origine peut être utilisée pour récupérer toutes les données, la seule modification que j'y apporterais serait d'exclure la colonne b.field_id car cela modifiera l'affichage final du résultat.

Si vous avez une liste connue de field_name valeurs que vous souhaitez transformer en colonnes, vous pouvez alors coder en dur votre requête :

select app_id,
  [First Name], [Last Name], [DOB],
  [Mailing Addr], [Zip]
from
(
  SELECT 
     a.app_id, 
     c.field_name,
     b.field_value 
  FROM table1 a
  INNER JOIN table2 b 
    ON a.app_id = b.app_id
  INNER JOIN table3 c 
    ON b.field_id = c.field_id 
) d
pivot
(
  max(field_value)
  for field_name in ([First Name], [Last Name], [DOB],
                     [Mailing Addr], [Zip])
) piv;

Voir SQL Fiddle avec démo.

Mais si vous allez avoir un nombre inconnu de valeurs pour field_name , vous devrez alors implémenter du SQL dynamique pour obtenir le résultat :

DECLARE @cols AS NVARCHAR(MAX),
    @query  AS NVARCHAR(MAX)

select @cols = STUFF((SELECT ',' + QUOTENAME(Field_name) 
                    from Table3
                    group by field_name, Field_id
                    order by Field_id
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')

set @query = 'SELECT app_id,' + @cols + ' 
            from 
            (
              SELECT 
                 a.app_id, 
                 c.field_name,
                 b.field_value 
              FROM table1 a
              INNER JOIN table2 b 
                ON a.app_id = b.app_id
              INNER JOIN table3 c 
                ON b.field_id = c.field_id 
            ) x
            pivot 
            (
                max(field_value)
                for field_name in (' + @cols + ')
            ) p '

execute sp_executesql @query;

Voir SQL Fiddle avec démo. Ces deux éléments donneront un résultat :

| APP_ID | FIRST NAME | LAST NAME |      DOB |    MAILING ADDR |   ZIP |
------------------------------------------------------------------------
|   1234 |        Joe |     Smith | 10/15/72 |     PO Box 1234 | 12345 |
|   1239 |        Bob |   Johnson | 12/01/78 | 1234 N Star Ave | 12456 |