Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Dane pionowe SQL Server 2008 na poziome

Możesz użyć funkcji PRZESTAWNA, aby przekonwertować wiersze danych na kolumny.

Twoje oryginalne zapytanie może zostać użyte do pobrania wszystkich danych, jedyną zmianą, jaką bym w nim wprowadził, byłoby wykluczenie kolumny b.field_id ponieważ zmieni to końcowe wyświetlanie wyniku.

Jeśli masz znaną listę field_name wartości, które chcesz przekształcić w kolumny, możesz zakodować zapytanie:

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;

Zobacz SQL Fiddle z wersją demonstracyjną.

Ale jeśli masz nieznaną liczbę wartości dla field_name , musisz zaimplementować dynamiczny SQL, aby uzyskać wynik:

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;

Zobacz SQL Fiddle z wersją demonstracyjną. Oba te dadzą wynik:

| 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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Co to jest literał znaku zerowego w TSQL?

  2. SQL Server sprawdza rozróżnianie wielkości liter?

  3. operacja niedozwolona, ​​gdy obiekt jest zamknięty podczas uruchamiania bardziej zaawansowanego zapytania

  4. Jak zaimportować plik .bak programu SQL Server do MySQL?

  5. Zapytania hierarchiczne w SQL Server 2005