sql >> Databáze >  >> RDS >> PostgreSQL

Postgres - Transponujte řádky do sloupců

Použijte crosstab() z modulu tablefunc.

SELECT * FROM crosstab(
   $$SELECT user_id, user_name, rn, email_address
     FROM  (
        SELECT u.user_id, u.user_name, e.email_address
             , row_number() OVER (PARTITION BY u.user_id
                            ORDER BY e.creation_date DESC NULLS LAST) AS rn
        FROM   usr u
        LEFT   JOIN email_tbl e USING (user_id)
        ) sub
     WHERE  rn < 4
     ORDER  BY user_id
   $$
  , 'VALUES (1),(2),(3)'
   ) AS t (user_id int, user_name text, email1 text, email2 text, email3 text);

Pro první parametr jsem použil dolarové kotace, které nemají žádný zvláštní význam. Je vhodné v řetězci dotazu uvozovat jednoduché uvozovky, což je běžný případ:

  • Vložit text s jednoduchými uvozovkami v PostgreSQL

Podrobné vysvětlení a pokyny:

  • PostgreSQL Crosstab Query

A zejména pro „sloupky navíc“:

  • Otočte se do více sloupců pomocí Tablefunc

Zvláštní potíže zde jsou:

  • Chybějící názvy klíčů.
    --> Dosazujeme pomocí row_number() v dílčím dotazu.

  • Různý počet e-mailů.
    --> Omezujeme na max. ze tří ve vnějším SELECT
    a použijte crosstab() se dvěma parametry, které poskytují seznam možných klíčů.

Věnujte pozornost NULLS LAST v ORDER BY .




  1. Funkce LOWER() v Oracle

  2. Chyba nesprávné hodnoty řetězce MySQL při ukládání řetězce unicode v Django

  3. Android with Room - Jak nastavit cizí klíč s možnou hodnotou Null

  4. Chyba při tisku proměnné REFCURSOR jako parametru OUT v proceduře v Oracle 11g