PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Postgres - Trasponi le righe in colonne

Usa crosstab() dal modulo 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);

Ho usato le virgolette in dollari per il primo parametro, che non ha un significato speciale. È semplicemente conveniente evitare le virgolette singole nella stringa di query, che è un caso comune:

  • Inserisci testo con virgolette singole in PostgreSQL

Spiegazione dettagliata e istruzioni:

  • Query a campi incrociati PostgreSQL

E in particolare, per le "colonne extra":

  • Pivota su più colonne utilizzando Tablefunc

Le difficoltà speciali ecco:

  • La mancanza di nomi di chiavi.
    --> Sostituiamo con row_number() in una sottoquery.

  • Il numero variabile di e-mail.
    --> Ci limitiamo a un massimo. di tre nel SELECT esterno
    e usa crosstab() con due parametri, fornendo un elenco di possibili chiavi.

Presta attenzione a NULLS LAST nel ORDER BY .