Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   SQL (https://www.clubdelphi.com/foros/forumdisplay.php?f=6)
-   -   Con Sql Puedo Resolver El Sig Evento (https://www.clubdelphi.com/foros/showthread.php?t=11666)

cmena 21-06-2004 23:44:30

Con Sql Puedo Resolver El Sig Evento
 
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.

Código SQL [-]
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

Código SQL [-]
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

gracias
 
Cita:

Empezado por jachguate
Lo podes hacer con una subconsulta a la tabla de ventas y el operador NOT EXISTS.

Código SQL [-]
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


La franja horaria es GMT +2. Ahora son las 19:52:54.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi