Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Vertikale Daten von SQL Server 2008 in Horizontale

Sie können die PIVOT-Funktion verwenden, um Ihre Datenzeilen in Spalten umzuwandeln.

Ihre ursprüngliche Abfrage kann zum Abrufen aller Daten verwendet werden. Die einzige Änderung, die ich daran vornehmen würde, wäre, die Spalte b.field_id auszuschließen da dies die endgültige Anzeige des Ergebnisses verändert.

Wenn Sie eine bekannte Liste von field_name haben Werte, die Sie in Spalten umwandeln möchten, dann können Sie Ihre Abfrage fest codieren:

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;

Siehe SQL Fiddle mit Demo.

Aber wenn Sie eine unbekannte Anzahl von Werten für field_name haben , dann müssen Sie dynamisches SQL implementieren, um das Ergebnis zu erhalten:

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;

Siehe SQL-Fiddle mit Demo. Beides ergibt folgendes Ergebnis:

| 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 |