RE: duda en la realizacion de una consulta

From: "Fernando Hevia" <fhevia(at)ip-tel(dot)com(dot)ar>
To: "'Jose Alberto Sanchez Nieto'" <albertosanchez(at)hiperusera(dot)es>, <pgsql-es-ayuda(at)postgresql(dot)org>
Subject: RE: duda en la realizacion de una consulta
Date: 2010-04-07 15:34:00
Message-ID: C7F504344BA749F7997B3E8561BDD7DE@iptel.com.ar
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-es-ayuda

> -----Mensaje original-----
> De: Jose Alberto Sanchez Nieto
>
> Hola a todos, tengo una pregunta sobre una query y me
> gustaría saber si es posible realizarla. Tengo dos tablas
> compras y ventas:
> Tabla compras Tabla ventas
> key_articulo key_articulo
> fecha_desde fecha
> fecha_hasta cantidad
> cantidad
>
> Pues bien, mi intención es pasarle a una función como
> parámetros la key_articulo y una fecha determinada, para
> después dentro de la función realizar una consulta sobre las
> dos tablas para que me devuelva la diferencia de cantidades
> entre ventas y compras teniendo como parámetros de búsqueda
> la key_articulo pasado en la función y la fecha, con esto me
> tendría que devolver de la tabla de compras el registro en el
> cuál la fecha pasada por parámetro estuviese comprendida
> (entre fecha_desde y fecha_hasta, teniendo también en cuenta
> que puede que no haya ningún registro que coincida y entonces
> tendría que devolver cero para poder realizar la operación de
> resta de cantidades). Lo mismo sería con la de ventas, puede
> no existir registro y devolver ceros ó existir y ser el más
> cercano a la fecha pasada por parámetro por detrás ó igual.
> Estoy trabajando
> con la siguiente query pero no doy con ello (sobre todo el
> manejar que no me encuetre el registro correspondiente tanto
> en la tabla de compras ó de ventas.
> El parámetro que le paso está en la variable v_key_articulo y
> en v_fecha
>
> select c.key_articulo, coalesce((v.cantidad - c.cantidad), 0) as
cantidad_real
> from compras as c, ventas as v
> where c.key_articulo = v_key_articulo
> and c.fecha_desde =
> (select max(cc.fecha_desde) from compras as cc
> where cc.fecha_desde <= v_fecha and cc.fecha_hasta >= v_fecha
> and cc.key_articulo = v_key_articulo)
> and v.fecha =
> (select vv.fecha from ventas as vv
> where vv.key_articulo = v_key_articulo
> and vv.fecha <= v_fecha
> order by fecha desc limit 1);

No entiendo porque en compras tenés fecha_desde y fecha_hasta. ¿Acaso es un
sumarizado?
Si te interpreté bien, propongo un approach más sencillo aprovechando que
admites una función:

CREATE OR REPLACE FUNCTION f_delta_mov_articulo(v_key_articulo bigint,
v_fecha date) RETURNS integer AS
$$
DECLARE
cant_compras integer;
cant_ventas integer;

BEGIN
cant_compras :=
SELECT coalesce(cantidad, 0) FROM compras
WHERE v_fecha BETWEEN fecha_desde AND fecha_hasta
AND key_articulo = v_key_articulo;

cant_ventas :=
SELECT coalesce(cantidad, 0) FROM ventas
WHERE fecha <= v_fecha
AND key_articulo = v_key_articulo
ORDER BY fecha DESC LIMIT 1;

RETURN cant_ventas - cant_compras;
END;
$$ LANGUAGE 'plpgsql;

Saludos,
Fernando.

In response to

Responses

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message Jose Alberto Sanchez Nieto 2010-04-07 15:35:12 Re: duda en la realizacion de una consulta
Previous Message (Syswarp) Carlos Enrique Perez 2010-04-07 15:32:59 RE: SPAM-LOW: if en una consulta