PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Postgres - Zeilen in Spalten transponieren

Verwenden Sie crosstab() aus dem tablefunc-Modul.

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);

Für den ersten Parameter, der keine besondere Bedeutung hat, habe ich Dollarnotierungen verwendet. Es ist einfach praktisch, einfache Anführungszeichen in der Abfragezeichenfolge zu maskieren, was ein häufiger Fall ist:

  • Text mit einfachen Anführungszeichen in PostgreSQL einfügen

Ausführliche Erklärung und Anleitung:

  • PostgreSQL-Kreuztabellenabfrage

Und insbesondere für "zusätzliche Spalten":

  • Pivotieren Sie mehrere Spalten mit Tablefunc

Die besonderen Schwierigkeiten hier sind:

  • Das Fehlen von Schlüsselnamen.
    --> Wir ersetzen durch row_number() in einer Unterabfrage.

  • Die unterschiedliche Anzahl von E-Mails.
    --> Wir beschränken uns auf max. von drei im äußeren SELECT
    und verwenden Sie crosstab() mit zwei Parametern, die eine Liste möglicher Schlüssel bereitstellen.

Achten Sie auf NULLS LAST im Feld ORDER BY .