sql >> Database teknologi >  >> RDS >> Sqlserver

SQL Server 2008 Vertikale data til vandret

Du kan bruge PIVOT-funktionen til at konvertere dine rækker af data til kolonner.

Din oprindelige forespørgsel kan bruges til at hente alle data, den eneste ændring, jeg ville foretage i den, ville være at ekskludere kolonnen b.field_id fordi dette vil ændre den endelige visning af resultatet.

Hvis du har en kendt liste over field_name værdier, som du vil omdanne til kolonner, så kan du hårdkode din forespørgsel:

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 hvis du skal have et ukendt antal værdier for field_name , så skal du implementere dynamisk SQL for at 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. Begge disse vil give et 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. Sådan opretter du en MySQL-database ved hjælp af cPanel API

  2. Returner en grupperet liste med forekomster ved hjælp af Rails og PostgreSQL

  3. Dvalekriterier for datoer

  4. Opdater aktivitetsdata fra tjenesten, når den er sat på pause