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.
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 |