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