Re: Funcion ventana nueva consulta

From: "Eduardo Arenas C(dot)" <edomax(at)gmail(dot)com>
To: Conrado Blasetti <conrado(at)mapfre(dot)com(dot)ar>
Cc: pgsql-es-ayuda <pgsql-es-ayuda(at)postgresql(dot)org>
Subject: Re: Funcion ventana nueva consulta
Date: 2012-05-26 12:21:35
Message-ID: CAEe4h9rF6gsTFvTgQ-dP-bVtFqLzwt4y3y=_u0nzmOdjU74qEQ@mail.gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-es-ayuda

Conrado,

De lo que he visto creo que no es posible hacer esto con funciones
ventana, ya que la ventana de calculo estaría dada por la fecha y esta va
cambiando día a día, aquí lo único que podrías calcular son todos los
movimientos de un día. Para sacar el informé específico que necesitas es
necesario hacer una función que acumule los valores de los movimientos sean
estos positivos (entradas) y negativos (salidas).

Ahora, analizando el problema, pienso que esto debería
estar implícito en el modelo de datos, mas que estar haciendo el cálculo
cada vez que necesitas la información. ¿Como haría esto?, crearía una tabla
que contendrá el valor actual de cada item y una tabla historia que guarde
el acumulado cada vez que se efectúa un movimiento en la tabla de
movimientos. De esta forma cuando necesitas ver los movimientos de un
periodo, puedas listas los movimientos y hacer un join con el histórico de
valores en ese periodo, lo cual debería dar lo que necesitas.

Por mi parte llegue a lo siguiente, que puede servir para ambas
opciones. a) poner esto en una función y calcular el acumulado, b) crear
una tabla de valores_actuales y una tabla de valores_actuales_historica
para hacer join con la siguiente query:

-------------------------------------------------------------------------------------------

select a.*,0.00::numeric as acumulado
from
(
select a.fecha
,a.id
,case when a.imp1 is null then 0.00 else imp1 end as imp1
,case when a.imp2 is null then 0.00 else imp2 end as imp2
from
(
select a.*
,b.imp as imp1
,c.imp*-1 as imp2

from
(
select distinct fecha,id
from foo
) as a
left join foo as b on a.id=b.id and b.tipo=1
left join foo as c on a.id=c.id and c.tipo=2
) as a
) as a
order by fecha
-------------------------------------------------------------------------------------------

Saludos

<http://www.saluduc.cl>

Eduardo Arenas Castillo
Jefe Unidad Gestión de la Información
Ancora UC - Red de Centros de Salud Familiar
of. + 56 2 587 9302 - cel. +56 9 6629 1618

2012/5/24 Conrado Blasetti <conrado(at)mapfre(dot)com(dot)ar>

> Exacto, solo que el acumulado del primer detalle tendría que comenzar
> con el acumulado del resumen anterior.****
>
> Pero si, creo que debería hacerlo directamente desde una función y tirar
> los datos de a uno.****
>
> Muchas gracias!****
>
> ** **
>
> *De:* Anthony [mailto:asotolongo(at)uci(dot)cu]
> *Enviado el:* jueves, 24 de mayo de 2012 13:08
>
> *Para:* Conrado Blasetti
> *CC:* pgsql-es-ayuda(at)postgresql(dot)org
> *Asunto:* Re: [pgsql-es-ayuda] Funcion ventana nueva consulta****
>
> ** **
>
> buneo lo mejor que puedo hacer con solo SQL es esto:
>
>
>
> (select null::date as fecha,sum(tipo1), sum(tipo2),
> sum(tipo1+(tipo2*-1)), 'Resumen'::text
>
> from (select id, fecha, imp as tipo1, 0 as tipo2, imp
>
> from foo
>
> where tipo= 1
>
> union
>
> select id, fecha, 0 as tipo1, imp as tipo2, imp*-1
>
> from foo
>
> where tipo= 2) as Aux
>
> where fecha <= '2012-04-01' )
> union all
>
>
> (select fecha,tipo1, tipo2, sum(imp) over (order by id), 'Detalle'::text
>
> from (select id, fecha, imp as tipo1, 0 as tipo2, imp
>
> from foo
>
> where tipo= 1
>
> union
>
> select id, fecha, 0 as tipo1, imp as tipo2, imp*-1
>
> from foo
>
> where tipo= 2) Aux
>
> where fecha between '2012-04-01' and '2012-04-30')
> union all
>
> (select null::date as fecha,sum(tipo1), sum(tipo2),
> sum(tipo1+(tipo2*-1)), 'Resumen'::text
>
> from (select id, fecha, imp as tipo1, 0 as tipo2, imp
>
> from foo
>
> where tipo= 1
>
> union
>
> select id, fecha, 0 as tipo1, imp as tipo2, imp*-1
>
> from foo
>
> where tipo= 2) as Aux
>
> where fecha >= '2012-04-30' order by fecha desc limit 1)
>
> si entiendo bien lo que me pides tendrás que hacerlo con una función
> en plpgsql usando cursores.
> saludos
>
> ****
>
> <http://www.uci.cu/>****
>
> ** **
>

In response to

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message German Gomez 2012-05-27 01:12:32 Re:L
Previous Message Alexis Camue 2012-05-26 02:45:57 Tipo de dato de una columna