
Puede ocurrir que en algunas situaciones necesitemos obtener los datos de las columnas de una tabla en Postgres para que dicha información sea mostrada en filas.
Para ver el funcionamiento de este tipo de consultas vamos a crear una tabla con los primeros 6 meses del año. Utilizamos dos filas de datos obtenidos de forma aleatoria.
Creamos la tabla.
DROP TABLE IF EXISTS "public"."ventas"; CREATE TABLE "public"."ventas" ( "id" int2 NOT NULL DEFAULT nextval('venta_id_seq'::regclass), "enero" int2, "febrero" int2, "marzo" int2, "abril" int2, "mayo" int2, "junio" int2 ); ALTER TABLE "public"."ventas" ADD CONSTRAINT "venta_pkey" PRIMARY KEY ("id");
Insertamos los datos aleatorios.
INSERT INTO "public"."ventas" VALUES (1, 400, 45, 234, 120, 112, 80); INSERT INTO "public"."ventas" VALUES (2, 345, 90, 198, 98, 145, 144);
La siguiente consulta muestra los datos de las columnas en filas.
select id, unnest(array[enero, febrero, marzo, abril, mayo, junio]) AS importe, unnest(array['Enero', 'Febrero', 'Marzo', 'Abril','Mayo','Junio']) AS meses FROM ventas group by id order by id
id | Importe | Mes |
1 | 400 | Enero |
1 | 45 | Febreo |
1 | 234 | Marzo |
1 | 120 | Abril |
1 | 112 | Mayo |
1 | 80 | Junio |
2 | 345 | Enero |
2 | 90 | Febreo |
2 | 198 | Marzo |
2 | 98 | Abril |
2 | 145 | Mayo |
2 | 144 | Junio |
Con una consulta normal los datos se verán asi.
id | Enero | Febrero | Marzo | Abril | Mayo | Junio |
1 | 400 | 45 | 234 | 120 | 112 | 80 |
2 | 345 | 90 | 198 | 98 | 145 | 144 |
Con la función “unnest” de postgres, y un par de arrays, conseguimos mostrar la información de cada una de las columnas de una tabla en una fila independiente. El segundo array que utilizamos es solo para mostrar en la fila el nombre de la columna correspondiente.
Este truco nos puede resultar muy útil cuando necesitamos mostrar los datos de una sola fila, en una tabla con muchas columnas, en vez de mostrar los datos en una extensa linea, podemos dividir cada columna en su correspondiente fila, mostrando la información de una forma más clara.