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?
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:
Esta consulta primero genera una CTE
weeks
que consiste en los números de semana deseados para pivotar. Luego, utilizaUNNEST
para deshacer la pivotación de los datos en filas con las columnasID
,week_number
yweek_value
. Finalmente, se une con la CTEweeks
para generar la salida deseada y se ordena porID
yweek_number
.Espero que esto te ayude. Avísame si tienes alguna otra pregunta.