PDA

Ver la Versión Completa : Con Sql Puedo Resolver El Sig Evento


cmena
21-06-2004, 23:44:30
Hola:
Tengo delphi 7 professional y trabajo con dbf/cdx y motor advantage.

Quiero emitir via sql los clientes que me han dejado de comprar hace mas de dos años, los datos historicos de todas las ventas los tengo en una tabla de ventas donde tengo el; cliente, la fecha de venta, el producto que me compro. Habia pensado crear un query con los solo las ventas de dos años atras, luego leer cada registro del query y chequear contra la tabla de ventas de que no exista una venta el los dos ultimos años, esto me parece demasiado largo y lento, quizas con un buen manejo de sql pueda hacerlo mas corto y rapido el proceso.

atte cmena

jachguate
22-06-2004, 00:38:34
Lo podes hacer con una subconsulta a la tabla de ventas y el operador NOT EXISTS.


Select id
from cliente c
where not exists (
select 1
from venta v
where v.cliente = c.cliente
and v.fecha >= now - (365 * 2)
)


La función now deberá ser portada a tu motor, y éste soportar aritmética de fechas. También fallará por 1 día en el caso de que uno de los últimos dos años sa bisiesto.

Hasta luego.

;)

ruina
22-06-2004, 10:02:33
con group by y having creo que puedes sacarlo


select a.codigocliente, max(a.fecha) , b.codigo, b.nombre
from clientes b
left outer join ventas a on a.codigocliente = b.codigo
group by a.codigocliente, b.codigo, b.nombre
having (max(fecha) < :parametro) or (max(fecha) is null)


el left outer join es para sacar tambien aquellos clientes que no tengan ninguna venta, he puesto la sintaxis de Interbase que es la que conozco, pero deberias tener un equivalente casi seguro, ya que es sql del 92.

La anterior tambien es válida, aunque creo (solo creo, no estoy seguro) que si tienes muchos registros esta deberia ser mas rápida

PD: :Parametro seria la fecha contra la que quieres chequear, asignala desde el mismo delphi que creo que será mas facil

cmena
23-06-2004, 02:42:10
Lo podes hacer con una subconsulta a la tabla de ventas y el operador NOT EXISTS.


Select id
from cliente c
where not exists (
select 1
from venta v
where v.cliente = c.cliente
and v.fecha >= now - (365 * 2)
)


La función now deberá ser portada a tu motor, y éste soportar aritmética de fechas. También fallará por 1 día en el caso de que uno de los últimos dos años sa bisiesto.

Hasta luego.

;)
buena tu solucion
gracias amigo
carlos
valparaiso chile