Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   SQL (https://www.clubdelphi.com/foros/forumdisplay.php?f=6)
-   -   Subconsulta con clientes sin comprar en un período de tiempo (https://www.clubdelphi.com/foros/showthread.php?t=76655)

ElDioni 16-11-2011 19:58:13

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.

abelg 16-11-2011 22:02:23

Sobre tu consulta, ¿con que Base de Datos estas trabajndo?.

ElDioni 17-11-2011 10:36:13

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.

José Luis Garcí 17-11-2011 14:36:18

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.

abelg 17-11-2011 14:43:03

Cita:

Empezado por ElDioni (Mensaje 418687)
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

ElDioni 17-11-2011 18:38:46

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.


La franja horaria es GMT +2. Ahora son las 16:37: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