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.

Desagrupar una tabla de PostgreSQL que tiene múltiples columnas.

Quiero pivotar una tabla con algunas columnas como se muestra a continuación.

ID semana1 semana2 semana3 semana4 semana5 semana6 semana7
1 8 9 10 11 12 13 14
2 15 16 17 18 19 20 21
3 22 23 24 25 26 27 28

El resultado deseado es el siguiente:

ID numero_semana valor_semana
1 1 8
1 2 9
1 3 10
1 4 11
1 5 12
1 6 13
1 7 14
2 1 15
2 2 16
2 3 17
2 4 18
2 5 19
2 6 20
2 7 21
3 1 22
3 2 23
3 3 24
3 4 25
3 5 26
3 6 27
3 7 28

Intenté usar crosstab pero no pude hacer que funcionara correctamente. A continuación, se muestra mi enfoque:

select * from crosstab(‘select ID,week1, week2,week3,week4,week5,week6,week7 order by ID’) as table_name(ID, numero_semana, valor_semana);

Por favor, ¿puede alguien ayudar ya que no tengo mucha experiencia en el manejo de consultas SQL complejas?

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Para pivotar la tabla como se desea, puedes utilizar la función UNNEST en combinación con una expresión de tabla común (CTE) para generar los números de semana dinámicamente. Aquí tienes una consulta de ejemplo que debería funcionar:

    WITH weeks AS (
      SELECT generate_series(1, 7) AS week_number
    ), unpivoted_data AS (
      SELECT ID, week_number, UNNEST(ARRAY[week1, week2, week3, week4, week5, week6, week7]) AS week_value
      FROM your_table
    )
    SELECT ID, week_number, week_value
    FROM unpivoted_data
    JOIN weeks ON unpivoted_data.week_number = weeks.week_number
    ORDER BY ID, week_number;
    

    Esta consulta primero genera una CTE weeks que consiste en los números de semana deseados para pivotar. Luego, utiliza UNNEST para deshacer la pivotación de los datos en filas con las columnas ID, week_number y week_value. Finalmente, se une con la CTE weeks para generar la salida deseada y se ordena por ID y week_number.

    Espero que esto te ayude. Avísame si tienes alguna otra pregunta.

Comments are closed.