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: "Alvaro Herrera" <alvherre(at)surnet(dot)cl>
Cc: <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 01:02:55
Message-ID: 001d01c56257$d0fc7550$2e00020a@chafireta
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-es-ayuda

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)

In response to

Responses

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message manuel lamas 2005-05-27 04:16:35 libpq++ y FreeBSD
Previous Message Jaime Casanova 2005-05-26 23:21:23 Re: returns de las funciones