post icon

Convertir filas en columnas en PostgreSQL con función de agregado

Lo común es ver la implementación de PIVOT o CROSSTABLES a la hora de pasar las filas a columnas, pero hay casos en donde se necesita algo más, ir concatenando los valores en una sola columna.

Este tipo de implementación no es común, pero puede que por alguna extraña regla de negocios lo necesites implementar. En cada motor existe una manera de implementarla, además que existen varias formas.

La manera más optima que he visto hasta ahora en PostgreSQL es valerse de las funciones y funciones de agregado que el motor ofrece.

El primer paso que debemos hacer es crear la Funcion:

CREATE FUNCTION coma_concat (text, text) RETURNS text
AS 'select case
WHEN $2 is null or $2 = '''' THEN $1
WHEN $1 is null or $1 = '''' THEN $2
ELSE $1 || '', '' || $2
END'
LANGUAGE sql;

Luego debemos crear la Funcion de Agregación

CREATE AGGREGATE LISTAR (
BASETYPE = text,
SFUNC = coma_concat,
STYPE = text,
INITCOND = ''
);

Luego solo debemos invocar la función desde cualquier query agrupando las filas, ejemplo:

SELECT TPLID, IMEI, LIST(ID_PRODUCT) AS CONCATENACION FROM SERVICES GROUP BY TPLID, IMEI;

Fuente

Comentarios desde Facebook:

Responder