Re: Convertir filas en columnas o Funcion de agregado (concatenar)

Lists: pgsql-es-ayuda
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
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: Juanky Moral <juanky(dot)moral(at)gmail(dot)com>
To: Alberto Piña <alberto(dot)pina(at)kebir(dot)com(dot)mx>
Cc: pgsql-es-ayuda(at)postgresql(dot)org
Subject: Re: Convertir filas en columnas o Funcion de agregado (concatenar)
Date: 2005-07-07 18:29:22
Message-ID: 463a53a40507071129155c6cb8@mail.gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: pgsql-es-ayuda

Muy interesante, gracias Alberto.

El 7/07/05, Alberto Piña<alberto(dot)pina(at)kebir(dot)com(dot)mx> escribió:
>
> 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
>

--
Juanky Moral
"Tendré que moverme más rápido: el horizonte brilla eléctrico."
(Horizonte Eléctrico - www.losdeltonos.com )


From: "Edwin Quijada" <listas_quijada(at)hotmail(dot)com>
To: alberto(dot)pina(at)kebir(dot)com(dot)mx
Cc: pgsql-es-ayuda(at)postgresql(dot)org
Subject: RE: Convertir filas en columnas o Funcion de agregado (concaten
Date: 2005-07-07 21:12:34
Message-ID: BAY14-F6B4C86C149F5A9031BCDBE3D80@phx.gbl
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: pgsql-es-ayuda

Bien hecho!!
Asi se hace.

*-------------------------------------------------------*
*-Edwin Quijada
*-Developer DataBase
*-JQ Microsistemas
*-809-747-2787
* " Si deseas lograr cosas excepcionales debes de hacer cosas fuera de lo
comun"
*-------------------------------------------------------*

>From: "Alberto Piña" <alberto(dot)pina(at)kebir(dot)com(dot)mx>
>To: <pgsql-es-ayuda(at)postgresql(dot)org>
>Subject: [pgsql-es-ayuda] Convertir filas en columnas o Funcion de agregado
>(concatenar)
>Date: Thu, 7 Jul 2005 11:18:53 -0500
>
>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
>
>

_________________________________________________________________
Consigue aquí las mejores y mas recientes ofertas de trabajo en América
Latina y USA: http://latam.msn.com/empleos/