sql >> Databáze >  >> RDS >> Oracle

Multicase SQL dotaz načíst jeden řádek jako více sloupců

V Oracle 11.1 a vyšších můžete použít UNPIVOT operátor. Máte-li velký objem dat, poskytne to výrazné zlepšení doby provádění, protože vyžaduje čtení tabulky pouze jednou, namísto třínásobného čtení jakéhokoli druhu UNION ALL přístup.

Změnil jsem název sloupce (ve výstupu) z date na dt protože DATE je v Oracle rezervované slovo. type není o moc lepší (je to klíčové slovo, ale není vyhrazeno); nejlepší je se tomu také vyhnout. Při vytváření testovacích dat jsem také zacházel s vašimi daty jako s řetězci, ale s daty to funguje úplně stejně.

with klauzule není součástí řešení (nekopírujte ji slepě a nevkládejte ji s dotazem); Přidal jsem to jen pro testovací účely.

with
     test_data ( ID, VT_Type1, Vt_type2, VT_Type3, Status_1, Status_2, Status_3, 
                                                         Date_1, Date_2, Date_3 ) as (
       select 1, -1, -1,  0, 'X', 'Y', 'Z', '04/12', '05/12', '06/12' from dual union all
       select 2, -1, -1, -1, 'A', 'B', 'C', '06/12', '07/12', '07/10' from dual
     )
select  id, type, status, dt
from    test_data
unpivot ( (vt_type, status, dt) for type in ( (vt_type1, status_1, date_1) as 1,
                                              (vt_type2, status_2, date_2) as 2,
                                              (vt_type3, status_3, date_3) as 3
                                            )
        )
where   vt_type != 0
;

ID  TYPE  STATUS  DT
--  ----  ------  -----
 1     1  X       04/12
 1     2  Y       05/12
 2     1  A       06/12
 2     2  B       07/12
 2     3  C       07/10


  1. Maximální velikost proměnné varchar(max).

  2. Chyba aplikace Rails - ActiveRecord::PendingMigrationError Migrace čekají na vyřízení; tento problém vyřešíte spuštěním 'rake db:migrate RAILS_ENV=development'

  3. Sdružování připojení databáze Celery Worker

  4. Co je InnoDB a MyISAM v MySQL?