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
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 |