Gracias Fernando por responder, la tabla de compras es una dimensión de un datawarehouse y las dimensiones siempre tienen "vigencia" del registro en cuestión de ahí lo de fecha_desde y fecha_hasta. La posibilidad que me envías también la realicé antes pero ahora las especificaciones que me han dado son que se tiene que realizar en una consulta (de hecho devuelvo la fila con setof record en la función), deben ser con una consulta ya que puede ser llamada desde una herramienta de reportes y ahí sólo se le puede indicar consultas y no funciones.
Muchas gracias.

Fernando Hevia escribió:
-----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.



--
José Alberto Sánchez Nieto
Responsable Dpto. Informática

Hiper Usera, S.L.
C.I.F. B85139855
Pol. Industrial Las Avenidas
Torrejón de la Calzada (Madrid)
C.P. 28991
Telf: 91 860 99 00
Fax: 91 816 00 00
email: [email protected]


--
TIP 6: ¿Has buscado en los archivos de nuestra lista de correo?
              http://archives.postgresql.org/pgsql-es-ayuda

Responder a