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: | Whole Thread | Raw Message | 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
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/>****
>
> ** **
>
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 |