sql >> Databáze >  >> RDS >> Sqlserver

SQL Server 2008 Vertikální data na vodorovnou

K převodu řádků dat na sloupce můžete použít funkci PIVOT.

Váš původní dotaz lze použít k načtení všech dat, jedinou změnu, kterou bych v něm provedl, by bylo vyloučit sloupec b.field_id protože to změní konečné zobrazení výsledku.

Pokud máte známý seznam field_name hodnoty, které chcete převést na sloupce, pak můžete svůj dotaz napevno zakódovat:

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;

Viz SQL Fiddle with Demo.

Ale pokud budete mít neznámý počet hodnot pro field_name , pak budete muset implementovat dynamické SQL, abyste získali výsledek:

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;

Viz SQL Fiddle s ukázkou. Obojí to dá výsledek:

| 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. Objevte typy na úrovni balíčků PL/SQL pomocí pohledů slovníku Oracle

  2. Použití příkazu IF ELSE založeného na počtu k provedení různých příkazů Insert

  3. Jak resetovat sekvenci v postgresu a vyplnit sloupec ID novými daty?

  4. phpMyAdmin na MySQL 8.0