Skip site navigation (1) Skip section navigation (2)

Re: Obteniendo informacion de 3 tablas en forma de columnas y no renglones. (Vista, Procedimiento Almacenado o consulta sencilla?).

From: "Alejandro Romero Parra" <aromero(at)etesa(dot)com(dot)mx>
To: "Mario Soto Cordones - Venezuela" <msotocl(at)gmail(dot)com>
Cc: "Alvaro Herrera" <alvherre(at)surnet(dot)cl>,<pgsql-es-ayuda(at)postgresql(dot)org>
Subject: Re: Obteniendo informacion de 3 tablas en forma de columnas y no renglones. (Vista, Procedimiento Almacenado o consulta sencilla?).
Date: 2005-05-27 15:09:49
Message-ID: 000601c562ce$20b205d0$2e00020a@chafireta (view raw or flat)
Thread:
Lists: pgsql-es-ayuda
Por lo que entonces tu solución usa:

[<<label>>]
FOR record_or_row IN query LOOP
    statements
END LOOP;Para construir esos nombre en mayúscula???En mi caso yo he tratado 
de hacer una función en postgresql, y lo que tengo hasta ahora es:CREATE 
FUNCTION regresacategorias() RETURNS text AS $$DECLARE resultado text; vista 
RECORD;BEGIN     FOR vista IN  select distinct cast(A.dias as varchar) || ' 
' || B.descripcion || ' ' || 'float 4' || ',' as Periodo    from precios A, 
mixtos B   where A.forma_cobro = B.clave_mixto   and B.tipo = 'F' LOOP 
resultado = resultado END LOOP; return resultado;END;$$ LANGUAGE plpgsql;Sin 
embargo, como era de esperarse para un usuario que apenas esta entrando a 
postgresql, la función de arriba no jala.Solo me he basado en la ayuda CHM 
de la BD por lo que no he podido encontrar todo el poderío para construir 
funciones.Esa es la razón de haber escrito en el correo anterior "he 
intentado con  ejemplos de la ayuda de postgresql para armar mi función pero 
no le encuentro pies ni cabeza".Tienes links donde haya buenos ejemplos de 
funciones que me den una pauta para continuar, porque lo interesante es 
quela rutina la construya uno, mas que te resuelvan el problema otras 
personas??Gracias por tu tiempo.----- Original Message ----- From: "Mario 
Soto Cordones - Venezuela" <msotocl(at)gmail(dot)com>
To: "Alejandro Romero Parra" <aromero(at)etesa(dot)com(dot)mx>
Cc: "Alvaro Herrera" <alvherre(at)surnet(dot)cl>; <pgsql-es-ayuda(at)postgresql(dot)org>
Sent: Friday, May 27, 2005 9:54 AM
Subject: Re: [pgsql-es-ayuda] Obteniendo informacion de 3 tablas en forma de 
columnas y no renglones. (Vista, Procedimiento Almacenado o consulta 
sencilla?).


> Hola como te comente en mi correo anterior, primero yo obtengo el
> nombre de las columnas para poder formar el query , esto lo hago con
> una funcion que me permite crear el query en forma dinamica,  recuerda
> que te dije que los nombres en mayusculas son los que la funcion me
> retorna y en un ciclo for lo agrego al query
>
> Espero te sirva
>
>
>
> El 26/05/05, Alejandro Romero Parra<aromero(at)etesa(dot)com(dot)mx> escribió:
>> Alvaro:
>>
>> Me encuentro a un paso de obtener los resultados que deseaba con la 
>> función
>> crosstab como aquí me indicaron, desafortunadamente los títulos de las
>> columnas transpuestas no son las que deseo, mira el crosstab es:
>>
>> ********************
>> select * from crosstab
>> (
>>   'select A.clave_producto, cast(A.dias as varchar) || '' '' ||
>> B.descripcion as Periodo, A.cantidad
>>   from precios A, mixtos B
>>   where A.forma_cobro = B.clave_mixto
>>   and B.tipo = ''F''
>>   order by A.clave_producto, A.dias, A.forma_cobro',
>>   'select distinct cast(A.dias as varchar) || '' '' || B.descripcion as
>> Periodo
>>   from precios A, mixtos B
>>   where A.forma_cobro = B.clave_mixto
>>   and B.tipo = ''F'''
>> )
>> as (clave_producto int2, b1 float4, b2 float4, b3 float4 , b4 float4 );
>> *********************
>>
>> En la parte de arriba se que todas las columnas que se me regresen serán
>> float4, de eso no hay pierde pero para sacar el título de las columnas 
>> ocupo
>> el siguiente QUERY:
>> ***************
>> select distinct cast(A.dias as varchar) || ' ' || B.descripcion || ' ' ||
>> 'float 4' || ',' as Periodo
>> from precios A, mixtos B
>> where A.forma_cobro = B.clave_mixto
>> and B.tipo = 'F'
>> ***************
>> Cuando ejecuto el QUERY de arriba me arroja esto:
>>
>> "24MESES float4,"
>> "24QUINCENAS float4,"
>> "36QUINCENAS float4,"
>> "48QUINCENAS float4,"
>>
>> Ahora bien, lo que estaba pensando era regresar los resultados en lugar 
>> de
>> las columnas b1 a b4 que estan al final del crosstab:
>>
>> "as (clave_producto int2, b1 float4, b2 float4, b3 float4 , b4 float4 );"
>>
>> Como puedo sustituir "b1 float4, b2 float4, b3 float4 , b4 float4" por el
>> resultado del QUERY arriba citado de tal forma que sea:
>>
>> "24MESES float4 , 24QUINCENAS float4, 36QUINCENAS float4, 48QUINCENAS
>> float4"
>>
>> Por la naturaleza del problema lo mas indicado es que se realiza por 
>> medio
>> de una función, ya que necesito que me regrese un TEXT, he intentado con 
>> ejemplos de la ayuda de postgresql para armar mi función pero no le 
>> encuentro pies ni cabeza, pensé entonces en un "store procedure" y me 
>> llevo
>> la sorpresa de que como tal no esta definido en la ayuda de postgresql.
>>
>> Algún tip???
>>
>> Gracias
>>
>>
>> ----- Original Message -----
>> From: "Alvaro Herrera" <alvherre(at)surnet(dot)cl>
>> To: "Alejandro Romero Parra" <aromero(at)etesa(dot)com(dot)mx>
>> Cc: <pgsql-es-ayuda(at)postgresql(dot)org>
>> Sent: Wednesday, May 25, 2005 11:08 AM
>> Subject: Re: [pgsql-es-ayuda] Obteniendo informacion de 3 tablas en forma 
>> de
>> columnas y no renglones. (Vista, Procedimiento Almacenado o consulta
>> sencilla?).
>>
>> > On Tue, May 24, 2005 at 10:13:13AM -0500, Alejandro Romero Parra wrote:
>> >
>> > Hola,
>> >
>> >> Que mecanismo se puede utilizar para traer la informacion de la
>> >> siguiente manera:
>> >
>> >> [tabla traspuesta cuya definicion de columnas es variable]
>> >
>> > Creo que lo que te convendria estudiar es si el modulo
>> > contrib/tablefunc te sirve, particularmente la funcion crosstab() que
>> > sirve para hacer trasposiciones de tablas.
>> >
>> >> De lo poco que he visto en postgresql esto se podria realizar con un
>> >> Store Procedure??, alguien ya ha implementado algo como esto?
>> >
>> > Es posible.  Pero no en PL/pgSQL.  Puede que en PL/Perl puedas hacerlo
>> > facilmente.  Por otro lado, cualquiera sea el lenguaje en que lo hagas,
>> > vas a necesitar definir el tipo de retorno exactamente _antes_ de
>> > conocer los resultados de la consulta, por lo que es posible que sea
>> > algo dificil hacer lo que quieres.
>> >
>> > Pensandolo bien, creo que tendrias dos opciones:
>> >
>> > 1. hacer dos consultas, la primera para saber cuantas columnas tendra 
>> > el
>> > resultado y con eso construir la segunda consulta;
>> >
>> > 2. retornar los resultados en un array.
>> >
>> > Lo segundo lo puedes hacer facilmente con PL/Perl, por ejemplo (sobre
>> > todo si sabes programar en Perl ... )
>> >
>> > --
>> > Alvaro Herrera (<alvherre[a]surnet.cl>)
>> > "Tiene valor aquel que admite que es un cobarde" (Fernandel)
>>
>> ---------------------------(fin del mensaje)---------------------------
>> TIP 1: para suscribirte y desuscribirte, escribe a 
>> majordomo(at)postgresql(dot)org
>>
>
>
> -- 
> cordialmente,
>
> Ing. Mario Soto Cordones 


In response to

pgsql-es-ayuda by date

Next:From: manuel lamasDate: 2005-05-27 15:13:30
Subject: Re: libpq++ y FreeBSD
Previous:From: Juan LuisDate: 2005-05-27 15:02:11
Subject: AYUDA - Access to PostgreSQL

Privacy Policy | About PostgreSQL
Copyright © 1996-2014 The PostgreSQL Global Development Group