Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > SQL
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 16-11-2011
Avatar de ElDioni
[ElDioni] ElDioni is offline
Miembro Premium
 
Registrado: jul 2005
Ubicación: Murcia (España)
Posts: 935
Poder: 19
ElDioni Va por buen camino
Subconsulta con clientes sin comprar en un período de tiempo

Hola, estoy teniendo problemas con esta subconsulta que quiero hacer y que no consigo resolver, a ver si me podeis echar una mano, os explico el problema.

Tengo una tabla con datos de clientes:

Cita:
CodCli:texto;
NomCli:texto;
y otra con facturas:

Cita:
CCodCli:texto;
Factura:Número;
Fecha:Fecha;
Precio:Número;
Lo que yo quiero obtener son los clientes que llevan 6 meses sin facturar pero que sus últimas compras esten recogidas en los últimos 12 meses. Por lo que los clientes que llevan más de 1 año sin comprar no saldrían (esto es para que no salgan los clientes del 2000, 2001, etc).

Al principio había puesto algo como esto:
Código SQL [-]
SELECT Clientes.* FROM Clientes WHERE clientes.codcli IN (SELECT DISTINCT CCODCLI FROM Facturas WHERE Fecha<#'+datetostr(now-(strtoint(TxtMesesSin.Text)*30))+'# AND fecha>#'+datetostr(now-(strtoint(txtMesesRango.text)*30))+'#)

El campo TxtMesesSin es donde se introducen los meses sin comprar, por defecto 6, y en TxtMesesRango se introduce el espacio de tiempo que se quiere tener en cuenta, por defecto 12.
Al ponerlo de esta forma lo que ocurre es que me saca clientes que han seguido comprando porque tienen facturas que cumplen la condición pero también otras más actuales.
Luego he puesto lo siguiente:

Código SQL [-]
SELECT clientes.* FROM clientes WHERE clientes.codcli IN (SELECT DISTINCT CCODCLI,max(fecha) as fecha FROM Facturas WHERE Fecha<#'+datetostr(now-(strtoint(TxtMesesSin.Text)*30))+'# AND Fecha>#'+datetostr(now-(strtoint(txtMesesRango.text)*30))+'# GROUP BY CCODCli)

Pero por lo visto no pueden aparecer dos campos en la subconsulta y me lanza un error diciendome que debería utilizar exists, pero por lo que he leido exists solo manda true o false a la consulta principal.

Espero sus noticias.

Gracias y saludos.
Responder Con Cita
  #2  
Antiguo 16-11-2011
abelg abelg is offline
Miembro
 
Registrado: jul 2004
Posts: 50
Poder: 20
abelg Va por buen camino
Sobre tu consulta, ¿con que Base de Datos estas trabajndo?.
Responder Con Cita
  #3  
Antiguo 17-11-2011
Avatar de ElDioni
[ElDioni] ElDioni is offline
Miembro Premium
 
Registrado: jul 2005
Ubicación: Murcia (España)
Posts: 935
Poder: 19
ElDioni Va por buen camino
No se si tiene algo que ver la base de datos con la que trabajo para la consulta SQL, de todas formas trabajo con ACCESS 97.
Responder Con Cita
  #4  
Antiguo 17-11-2011
Avatar de José Luis Garcí
[José Luis Garcí] José Luis Garcí is offline
Miembro Premium
 
Registrado: may 2003
Ubicación: Las Palmas de G.C.
Posts: 1.372
Poder: 22
José Luis Garcí Va camino a la fama
No se si te servira, pero yo en las consultas en las que van fechas, primero de todo las solicito MM/DD/AAAA ya que cuando lo he hecj¡ho con el formato lógico para nosostros DD/MM/AAAA, me ha dado error.

espero te ayude.
__________________
Un saludo desde Canarias, "El abuelo Cebolleta"
Responder Con Cita
  #5  
Antiguo 17-11-2011
abelg abelg is offline
Miembro
 
Registrado: jul 2004
Posts: 50
Poder: 20
abelg Va por buen camino
Cita:
Empezado por ElDioni Ver Mensaje
No se si tiene algo que ver la base de datos con la que trabajo para la consulta SQL, de todas formas trabajo con ACCESS 97.
Bueno mira es por esto.
Código SQL [-]
Select c.CodCli,
    c.NomCli,
    MAX(Fecha) ultimaFechadeCompra
from factura f
inner join Cliente c on f.CCodCli = c.CodCli
group by c.CodCli,
    c.NomCli
having (Case When MAX(f.Fecha) between dateadd(MM, @Tmeses*-1, getdate()) 
                  and dateadd(mm, @Mmeses*-1, GETDATE()) then 1 else 0 end) = 1
miras el Having en su expresión tiene un CASE When Then Else cosa que creo en Access no hay, espero se pueda hacer esto con un iif() en Access, esta consulta funciona en SqlServer y otras que soporten CASE.
Salu2
Responder Con Cita
  #6  
Antiguo 17-11-2011
Avatar de ElDioni
[ElDioni] ElDioni is offline
Miembro Premium
 
Registrado: jul 2005
Ubicación: Murcia (España)
Posts: 935
Poder: 19
ElDioni Va por buen camino
Gracias por sus respuestas,
he estado probando la solución propuesta y efectivamente al meterle el having me salta un error que dice "error no especificado", esta claro ¿no?, doy por supuesto que es el having o el case.

Seguiré probando.
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

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

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Comprar Delphi original o usarlo periodo de pruebas ? flashtkd Debates 12 06-08-2011 21:16:57
Documental: Comprar, tirar, comprar rretamar La Taberna 11 26-01-2011 18:06:40
Como direccionar a una pagina en un periodo de tiempo Shidalis PHP 15 28-04-2006 19:23:33
Es Posible que 2 ó más Clientes Bloqueen 1 Registro al mismo tiempo???? AGAG4 Conexión con bases de datos 0 06-01-2006 00:28:13
Mis clientes necesitan comprar Interbase? Osorio Firebird e Interbase 3 09-07-2003 22:28:29


La franja horaria es GMT +2. Ahora son las 11:42:59.


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