es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Cómo unirse y transponer filas a columnas en Redshift

Tengo la siguiente tabla1 y su clave única es tipo

tipo edad
A 20
B 21
C 22

Y tengo la siguiente tabla de resultados. Me gustaría unirlos de la siguiente manera


tipo puntaje
A 10
A 20
A 30
B 40
B 50

en la siguiente forma transpuesta.


tipo edad puntaje puntaje puntaje
A 20 10 20 30
B 21 40 50 na
C 22 na na na

¿Hay alguna forma de lograr esto?


select *
from table1
left join table2 usando(tipo)

No se transpusieron las filas.
Si alguien tiene alguna opinión, por favor avíseme.
gracias

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para lograr la forma transpuesta deseada, puedes utilizar la función pivot en SQL. Aquí tienes una consulta de ejemplo para tu escenario:

    SELECT 
        t1.type, 
        t1.age, 
        COALESCE(p.s1, 'na') AS score1, 
        COALESCE(p.s2, 'na') AS score2, 
        COALESCE(p.s3, 'na') AS score3 
    FROM table1 t1 
    LEFT JOIN (
        SELECT 
            type, 
            MAX(CASE WHEN row_num = 1 THEN score END) AS s1,
            MAX(CASE WHEN row_num = 2 THEN score END) AS s2,
            MAX(CASE WHEN row_num = 3 THEN score END) AS s3
        FROM (
            SELECT 
                type, 
                score, 
                ROW_NUMBER() OVER(PARTITION BY type ORDER BY score) AS row_num 
            FROM table2
        ) t2
        GROUP BY type
    ) p ON t1.type = p.type;
    

    Explicación:
    – En primer lugar, unimos table1 y table2 en la columna type utilizando LEFT JOIN.
    – Luego, utilizamos una subconsulta para pivotar la columna score de table2 en tres columnas separadas basadas en type.
    – Para realizar esta operación de pivot, utilizamos la función ROW_NUMBER para generar números de fila para cada type único, y luego seleccionamos los valores de score para cada número de fila como columnas individuales utilizando declaraciones CASE en la consulta interna SELECT.
    – A continuación, agrupamos el conjunto de resultados de la consulta interna por type para obtener los valores agregados de score para cada type.
    – Por último, seleccionamos todas las columnas requeridas (type, age, score1, score2, score3) de table1 y p, y utilizamos la función COALESCE para reemplazar los valores NULL por 'na'.

Comments are closed.