Consulta en PL complicada

Necesito presentar las 3 ultimas compras de todos los producto de un cliente.
El problema es que el cliente puede haber comprado esos productos en diferentes tiempos y en diferentes documentos.
Ejemplo:
Arroz lo compro Mayo/2009, Marzo/2009, Enero/2009
Maiz Junio/2008, Mar/2007, Enero/2007
No importa cuando lo haya aquirido.
Para sacar estos datos hice 3 cursores
1-Trae los clientes
2. Todos los ariticulos facturados por el cliente
SELECT l.no_arti
FROM facturas f, DetalleFactura l
WHERE  f.cliente = xxx
AND l.tipo_doc = f.tipo_doc
AND l.no_factu = f.no_factu
GROUP BY l.no_arti ;
3. De cada uno de estos articulos facturados
SELECT l.no_arti, l.cant, f.fecha
FROM facturas f, DetalleFactura l
WHERE  f.cliente = xxx
AND l.no_arti = yyyyy
AND l.tipo_doc = f.tipo_doc
AND l.no_factu = f.no_factu
GROUP BY l.no_arti, l.cant, f.fecha
ORDER BY l.no_arti, f.fecha DESC;
La cantidad de información que recorre es grande especialmente porque la consulta anterior la recorro dos veces. Una para sacar todos los acticulos facurados por el cliente y la otra para sacar las ultimas 3 ventas de ese producto.
Lo que necesito es recorrerla una sola vez y que me de la información necesaria.
Que sugerencias me pueden dar
Gracias

1 respuesta

Respuesta
1
Los cursores están muy penalizados por el consumo de memoria, sobre todo para cuando se poseen muchos registros, por ello te propongo la siguiente consulta
with
-- Consulta del punto 1
Clientes as (
select cliente
from t_clientes
)
-- Consultas del punto 2 y 3
, compras as (
select dft.no_arti,
dft.cant,
fac.fecha,
row_number()over(partition by dft.no_arti order by fac.fecha desc) as numero_ultima_compra
from facturas fac,
DetalleFactura dft,
cliente cli
where fac.cliente = cli.cliente
and dft.no_factu = fac.no_factu
and dft.tipo_doc = fac.tipo_doc
)
-- Filtro para mostrar sólo las 3 últimas compras de un cliente-producto (independientemente del documento/fecha)
select no_arti,
cant,
fecha
from compras
where numero_ultima_compra <= 3
Si te falla tendrías que exponer el modelo básico y datos de ejemplo con lo que quieres obtener, pero este es el concepto que tienes que implementar y no 3 cursores ineficientes (tú misma te has dado cuenta)

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas