Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > SQL
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 21-06-2004
cmena cmena is offline
Miembro
 
Registrado: abr 2004
Ubicación: CHILE
Posts: 67
Poder: 21
cmena Va por buen camino
Question 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
Responder Con Cita
  #2  
Antiguo 22-06-2004
Avatar de jachguate
jachguate jachguate is offline
Miembro
 
Registrado: may 2003
Ubicación: Guatemala
Posts: 6.254
Poder: 28
jachguate Va por buen camino
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.

__________________
Juan Antonio Castillo Hernández (jachguate)
Guía de Estilo | Etiqueta CODE | Búsca antes de preguntar | blog de jachguate
Responder Con Cita
  #3  
Antiguo 22-06-2004
Avatar de ruina
ruina ruina is offline
Miembro
 
Registrado: jun 2004
Posts: 196
Poder: 20
ruina Va por buen camino
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

Última edición por ruina fecha: 22-06-2004 a las 10:14:37.
Responder Con Cita
  #4  
Antiguo 23-06-2004
cmena cmena is offline
Miembro
 
Registrado: abr 2004
Ubicación: CHILE
Posts: 67
Poder: 21
cmena Va por buen camino
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
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro


La franja horaria es GMT +2. Ahora son las 13:16:23.


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
Copyright 1996-2007 Club Delphi