sql >> Databasteknik >  >> RDS >> Sqlserver

SQL Server 2008 Vertikal data till horisontell

Du kan använda PIVOT-funktionen för att konvertera dina datarader till kolumner.

Din ursprungliga fråga kan användas för att hämta all data, den enda ändring jag skulle göra i den skulle vara att utesluta kolumnen b.field_id eftersom detta kommer att ändra den slutliga visningen av resultatet.

Om du har en känd lista med field_name värden som du vill omvandla till kolumner, så kan du hårdkoda din fråga:

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;

Se SQL Fiddle with Demo.

Men om du ska ha ett okänt antal värden för field_name , då måste du implementera dynamisk SQL för att få resultatet:

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;

Se SQL Fiddle with Demo. Båda dessa kommer att ge ett resultat:

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


  1. Omvänd sträng ord för ord med SQL

  2. Liquibase lås - anledningar?

  3. Hur hittar man beroenden i ett orakelpaket?

  4. De vanligaste PostgreSQL-felscenarierna