sql >> Base de Datos >  >> RDS >> PostgreSQL

Postgres - Transponer filas a columnas

Usar crosstab() del módulo 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);

Utilicé cotizaciones en dólares para el primer parámetro, que no tiene un significado especial. Es conveniente escapar de las comillas simples en la cadena de consulta, que es un caso común:

  • Insertar texto con comillas simples en PostgreSQL

Explicación detallada e instrucciones:

  • Consulta de tabulación cruzada de PostgreSQL

Y en particular, para "columnas extra":

  • Pivote en múltiples columnas usando Tablefunc

Las dificultades especiales aquí están:

  • La falta de nombres clave.
    --> Sustituimos con row_number() en una subconsulta.

  • El número variable de correos electrónicos.
    --> Limitamos a un máximo. de tres en el exterior SELECT
    y usa crosstab() con dos parámetros, proporcionando una lista de posibles claves.

Preste atención a NULLS LAST en el ORDER BY .