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

--
TIP 10: no uses HTML en tu pregunta, seguro que quien responda no podrá leerlo

Responder a