sql >> Database >  >> RDS >> Sqlserver

SQL Server 2008 Verticale gegevens naar Horizontaal

U kunt de PIVOT-functie gebruiken om uw rijen met gegevens om te zetten in kolommen.

Uw oorspronkelijke zoekopdracht kan worden gebruikt om alle gegevens op te halen, de enige wijziging die ik zou aanbrengen zou zijn om de kolom b.field_id uit te sluiten omdat dit de uiteindelijke weergave van het resultaat zal veranderen.

Als u een bekende lijst heeft van field_name waarden die u in kolommen wilt omzetten, dan kunt u uw zoekopdracht hardcoderen:

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;

Zie SQL Fiddle met demo.

Maar als u een onbekend aantal waarden krijgt voor field_name , dan moet u dynamische SQL implementeren om het resultaat te krijgen:

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;

Zie SQL Fiddle met demo. Dit geeft beide een resultaat:

| 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. Hoe u correct UTF-8-strings in MySQL schrijft via de JDBC-interface

  2. Hoe current_time werkt in PostgreSQL

  3. 911/112:een gegevensmodel voor noodoproepen

  4. Microsoft Access-webapp versus desktopdatabase