Convertir filas en columnas o Funcion de agregado (concatenar)

From: "Alberto Pia" <alberto(dot)pina(at)kebir(dot)com(dot)mx>
To: <pgsql-es-ayuda(at)postgresql(dot)org>
Subject: Convertir filas en columnas o Funcion de agregado (concatenar)
Date: 2005-07-07 16:18:53
Message-ID: 20050707161851.93EA352828@svr1.postgresql.org
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-es-ayuda

Saludos Lista.
Espero que esto le ayude a algunos que han tenido el mismo problema que yo.
Estuve buscando por la red como convertir filas en columnas, aunque en
realidad no era precisamente lo que estaba buscando. les explico mi caso.
Supongan una tabla con esta

Select * from tabla;

Columna1 | Columna2
================
a | v1
a | v3
b | v2
b | v4

Y necesitan regresar algo como esto

Col1 | Col2
=========
a | v1,v3
b | v2,v4

La primera solucion que encontre fue hacer una funcion que segun el valor de
columna 1 concatenara columna 2 a si misma y regresara dicho resultado, todo
iba bien con 5 o 10 registros, el problema es que en grandes cantidades de
registros mi query se tardaba mucho en regresar el resultado de dicha
funcion. Se que tal vez con los indices correctos o con un buen tuning de
mi base de datos, o tal vez con un mejor diseño de mi funcion hubiera podido
reducir el tiempo de respuesta de mi query, pero la verdad es que lo que
encontre estuvo mucho mas rapido y creo yo mejor implementado.

Lo que encontre es una funcion de agregado que te permite a traves de un
query como
SELECT columna1 , list(columna2) FROM tabla GROUP BY columna1
Obtener el resultado deseado.

El codigo de la funcion y el type list es

CREATE FUNCTION comma_cat (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;

CREATE AGGREGATE list (
BASETYPE = text,
SFUNC = comma_cat,
STYPE = text,
INITCOND = ''
);

El que dio la respuesta en el foro es Luis C. Ferreira (honor a quien honor
merece).
http://www.webservertalk.com/archive143-2004-1-94830.html

Espero que a alguien le sirva (asi como somos muy buenos para preguntar, es
bueno tambien a veces aportar, espero haberlo hecho).
Saludos a todos

Atentamente

Ing. Alberto Piña Uribe

Consultoría y Desarrollo

KEBIR Infraestructura Tecnológica

alberto(dot)pina(at)kebir(dot)com(dot)mx

Cel. 044-55-59-64-85-07

Tel. 55-30-22-37

Fax 55-38-88-49


Responses

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message Alvaro Herrera 2005-07-07 16:29:44 Re: Recuperar la BD en Post
Previous Message Alvaro Herrera 2005-07-07 16:06:37 Re: Recuperar la BD en Post