From: | Gabriel Hermes Colina Zambra <hermeszambra(at)yahoo(dot)com> |
---|---|
To: | Jaime Casanova <systemguards(at)gmail(dot)com> |
Cc: | pgsql-es-ayuda(at)postgresql(dot)org |
Subject: | Re: mostrar resultado del cursor. |
Date: | 2008-02-23 03:34:55 |
Message-ID: | 685955.40801.qm@web63704.mail.re1.yahoo.com |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-es-ayuda |
Jaime te pongo el archivo completo en el attachment,
pues la lista me mando un mensaje como que no soy
miembro del grupo y seria evaluado, creo que
realemente paso es que el mensaje es larguisimo.
Ojala lo puedas leer, puede ser un indicio para la
pivot table que necesitamos en postgresql, para poder
hacer un crosstab sin saber la cantidad de filas a
priori
igualmete pongo parte del mensaje que hay attachado
"Jaime Casanova" escribio
> o mucho me equivoco o este FOR no hace nada util...
Te equivocas muchisimo, pero no importa la culpa no es
tuya es mia, te pase la funcion incompleta por que no
me funcionaba y lo que queria era saber como devuelvo
un cursor, que todavia no logro, pero te explico lo
que intento hacer.
Resulta que hace tiempo queria mejorar nuestra
contribucion crosstab, por que pienso que esa es una
debilidad no resuelta con respcto al pivot table de
access.
Luego de trabajar mucho con ella, lo deje en un cajon
hasta que Alvaro me pregunto en que quedo el proyecto,
lo desempolve y ni bien empeze tome otro camino.
Ahora les cuento la idea.
select
public.pivot_table2('central.cabezales','id_empresa','id_documentos','importe_con_impuestos','ref');
Parametros
1 cualquier nombre de tabla o vista
2 campo de la columna 1 de la tabla curzada
3 campo 2 el que va a formar tantas columnas como
valores variantes hallan en ese campo
4 campo a sumar,contar,promediar etc.
(en esta funcion que paso solo suma)
5 parametro para nombre de cursor.
El cual no logro tomar.
Entonces con todo esto procesado en
FOR mvista IN execute 'SELECT '|| tcampo2 ||' as
campo2 FROM '|| tvista_tabla
|| ' GROUP BY '|| tcampo2 || ' ORDER BY ' || tcampo2
||';'
LOOP
nI:=nI + 1;
tcuerpo:=tcuerpo || 'sum(case when '|| tcampo2 || '='
|| coalesce(mvista.campo2,0) || ' then ' || tcampo2 ||
' else 0 end) as ' || tcampo2 ||
coalesce(mvista.campo2,0) || ',';
END LOOP;
Logro para este caso formar esta consulta, sin saber
cuantos valores tengo en id_documentos en este caso en
campo2 para cualquier caso logico de ser procesado en
una crosstab, pero a diferencia de la que tenemos como
dije aca no necesito saber a priori esto.
El resultado para el execute final para devolver el
cursor es el siguiente en este caso, lo grabe en un
campo text con un insert para poder mostrarlo.
perdon por lo extenso pero vale la pena
La funcion es esta
CREATE OR REPLACE FUNCTION "public"."pivot_table2"
(tvista_tabla text, tcampo1 text, tcampo2 text,
tcampo3 text, ref "pg_catalog"."refcursor") RETURNS
"pg_catalog"."refcursor" AS
$body$
DECLARE
tvista_tabla alias for $1;
tcampo1 alias for $2;
tcampo2 alias for $3;
tcampo3 alias for $4;
tcuerpo text;
mvista RECORD;
ref alias for $5;
nI integer;
BEGIN
nI:=0;
tcuerpo:='';
FOR mvista IN execute 'SELECT '|| tcampo2 ||' as
campo2 FROM '|| tvista_tabla
|| ' GROUP BY '|| tcampo2 || ' ORDER BY ' || tcampo2
||';'
LOOP
nI:=nI + 1;
tcuerpo:=tcuerpo || 'sum(case when '|| tcampo2 || '='
|| coalesce(mvista.campo2,0) || ' then ' || tcampo2 ||
' else 0 end) as ' || tcampo2 ||
coalesce(mvista.campo2,0) || ',';
END LOOP;
open ref for execute 'select ' || tcampo1 || ',' ||
tcuerpo || '0 as total from ' || tvista_tabla || '
GROUP BY '|| tcampo1 || ' ORDER BY ' || tcampo1;
RETURN ref;
END;
$body$
LANGUAGE 'plpgsql' VOLATILE CALLED ON NULL INPUT
SECURITY INVOKER;
me devuelve el resultado que analiza el ultimo execute
el cursor llamado ref que en el txt describo completo,
lo ejecute y me salio bien
select
public.pivot_table2('central.cabezales','id_empresa','id_documentos','importe_con_impuestos','ref');
Veo pivot_table2
ref
Despues hago asi
FETCH ALL IN ref;
Cursor ref no existe es lo que me devuelve
Creo que es una lastima no seguir profundizando por
estar trancado aqui, por que aunque muy rudimentario
por ahora, esta seria una buena solucion
Atte.
Gabriel Colina
____________________________________________________________________________________
¡Capacidad ilimitada de almacenamiento en tu correo!
No te preocupes más por el espacio de tu cuenta con Correo Yahoo!:
http://correo.espanol.yahoo.com/
Attachment | Content-Type | Size |
---|---|---|
pivot.txt | text/plain | 6.3 KB |
From | Date | Subject | |
---|---|---|---|
Next Message | Gabriel Hermes Colina Zambra | 2008-02-23 03:56:51 | Vuelvo con el post de de pivot table no me elminen de la lista please |
Previous Message | Gabriel Hermes Colina Zambra | 2008-02-23 02:58:47 | Re: mostrar resultado del cursor. |