Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General »

[SOLUCIONADO] Consulta clientes con compras todos los meses

Estas en el tema de Consulta clientes con compras todos los meses en el foro de Bases de Datos General en Foros del Web. Buenos días, tengo un lío con una consulta que no logro resolver. Lo primero: Estamos hablando de DBase vía ODBC con las restricciones que ello ...
  #1 (permalink)  
Antiguo 31/01/2013, 04:17
 
Fecha de Ingreso: abril-2012
Mensajes: 590
Antigüedad: 12 años, 7 meses
Puntos: 58
Consulta clientes con compras todos los meses

Buenos días,

tengo un lío con una consulta que no logro resolver. Lo primero:
Estamos hablando de DBase vía ODBC con las restricciones que ello implica, sobretodo en materia de subquerys.

Lo que necesito es sacar un listado de clientes que tengan compras todos los meses de un año en concreto (o por año).

Lo máximo que he conseguido hacer es esto:
Código SQL:
Ver original
  1. SELECT nombre FROM clientes c WHERE clatip=2
  2. AND c.clacli IN (SELECT clacli FROM factura WHERE MONTH(fecha)=1 AND YEAR(fecha)=2012)
  3. AND c.clacli IN (SELECT clacli FROM factura WHERE MONTH(fecha)=2 AND YEAR(fecha)=2012)
  4. AND c.clacli IN (SELECT clacli FROM factura WHERE MONTH(fecha)=3 AND YEAR(fecha)=2012)

Pero claro, no sólo es feo sino que el rendimiento es pésimo.

¿Alguna sugerencia?
Gracias!

Ahora llegué hasta esto. Parece que los datos dan bien pero no se si es correcto o hay alguna otra forma mejor:
Código SQL:
Ver original
  1. SELECT nombre FROM clientes WHERE clatip=2 AND clacli IN (SELECT clacli, MONTH(fecha) AS 'mes' FROM factura WHERE YEAR(fecha)=2012 GROUP BY clacli, mes HAVING COUNT(clacli)=12)

El problema ahora, es que la subconsulta está bien, pero no me deja hacer el IN porque claro, estoy devolviendo el clacli (clave cliente) y también el mes, pero es que sino pongo el mes no puedo agrupar por mes. Si intento agrupar con month(fecha) directamente no va.

Me acabo de dar cuenta que así da mal claro. Tendría que ser HAVING COUNT(mes)=12 pero da error. Debe ser limitación de DBase

Última edición por alyciashape; 31/01/2013 a las 05:13
  #2 (permalink)  
Antiguo 31/01/2013, 05:22
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 17 años
Puntos: 2658
Respuesta: Consulta clientes con compras todos los meses

Volvamos al principio:
Código MySQL:
Ver original
  1. SELECT nombre
  2. FROM clientes c
  3. WHERE clatip=2
  4. AND clacli IN (
  5.     SELECT clacli
  6.     FROM factura
  7.     WHERE month(fecha) IN(1, 2, 3) AND year(fecha)=2012);
Creo que es más simple...

La otra está simplemente mal, porque intentas comparar un sólo campo, contra dos campos, y eso es incorrecto.
Esa consulta debes er replanteada, y te sugiero obtenerla usando JOINs.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #3 (permalink)  
Antiguo 31/01/2013, 05:42
 
Fecha de Ingreso: abril-2012
Mensajes: 590
Antigüedad: 12 años, 7 meses
Puntos: 58
Respuesta: Consulta clientes con compras todos los meses

Gracias gnzsoloyo no se me había ocurrido ese sistema.

Sin embargo lo acabo de probar y del listado que me saca, que es mas grande de lo esperado, hice algunas comprobaciones aleatorias y salen clientes que no tienen compras en ciertos meses. Huelga decir que he terminado la sentencia con (1,2,3,4,5...).

Así creo que salen todos los que tengan alguna compra esos meses, pero no los que tengan compras en todos los meses.
  #4 (permalink)  
Antiguo 31/01/2013, 05:51
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 17 años
Puntos: 2658
Respuesta: Consulta clientes con compras todos los meses

Postea la sentencia completa que usas y una muestra de lso datos que dices que no corresponden.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #5 (permalink)  
Antiguo 31/01/2013, 05:56
 
Fecha de Ingreso: abril-2012
Mensajes: 590
Antigüedad: 12 años, 7 meses
Puntos: 58
Respuesta: Consulta clientes con compras todos los meses

Veamos, uso la sentencia que habías puesto tú:
Código SQL:
Ver original
  1. SELECT clacli, nombre, nompas FROM clientes c
  2. INNER JOIN codpais co ON c.clapai=co.clapai
  3. WHERE clatip=2
  4. AND clacli IN (  SELECT clacli FROM factura WHERE MONTH(fecha) IN(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12) AND YEAR(fecha)=2012)
  5. AND co.clapai IN (10, 23)

Sólo añadí los meses restantes y la tabla países que me indica de qué páis es el cliente, y muestro el nombre (nompas).

Ahora, si cojo uno de esos registros que me devuelve la sentencia (clave, nombre y pais) y hago esto:
SELECT clacli FROM factura WHERE clacli=10 AND month(fecha)=1 AND year(fecha)=2012

No me da resultados, en ese caso mismamente. Algunos voy probando con 1, 2, 3... y algún mes no tienen datos. Este directamente no tiene compras en enero.
  #6 (permalink)  
Antiguo 31/01/2013, 06:13
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 17 años
Puntos: 2658
Respuesta: Consulta clientes con compras todos los meses

El problema es la restricción que pone el ODBC, que no entenderá consultas más elaboradas, y ni hablar del dBASE, que es un manejador de tablas bastante rudimentario.
Si fuese, por ejemplo, MySQL, podría ser así:
Código MySQL:
Ver original
  1.     clacli,
  2.     nombre,
  3.     nompas
  4. FROM clientes c INNER JOIN codpais co ON c.clapai=co.clapai
  5. WHERE clatip=2
  6. AND clacli IN(
  7.             SELECT clacli
  8.             FROM factura
  9.             WHERE MONTH(fecha) IN  (1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12) AND YEAR(fecha)=2012
  10.             GROUP BY clacli
  11.             HAVING COUNT(DISTINCT MONTH(fecha))) = 12            
  12. AND co.clapai IN (10, 23);
Pero en tu caso, es posible que haya que hacer algo más complicado.
Veamos si soporta esto:
Código SQL:
Ver original
  1. SELECT
  2.     clacli,
  3.     nombre,
  4.     nompas
  5. FROM
  6.     clientes c
  7.     INNER JOIN codpais co ON c.clapai=co.clapai
  8.     INNER JOIN (SELECT clacli, COUNT(DISTINCT fecha) fechas
  9.                 FROM factura
  10.                 WHERE MONTH(fecha) IN  (1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12) AND YEAR(fecha)=2012
  11.                 GROUP BY clacli) t1
  12. WHERE
  13.     clatip=2
  14.     AND t1.fechas = 12
  15.     AND co.clapai IN (10, 23);
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #7 (permalink)  
Antiguo 31/01/2013, 06:20
 
Fecha de Ingreso: abril-2012
Mensajes: 590
Antigüedad: 12 años, 7 meses
Puntos: 58
Respuesta: Consulta clientes con compras todos los meses

No lo soporta, da error :( Error de Sintaxis

Warning: odbc_exec(): SQL error: [Microsoft][ODBC Visual FoxPro Driver]Syntax error., SQL state 37000 in SQLExecDirec

Pero gracias por la currada. Supongo que no hay solución posible excepto que me pase la tabla completa a MySQL para poder hacer la consulta, o sacar los datos usando varias consultas con programacion.
  #8 (permalink)  
Antiguo 31/01/2013, 06:26
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 17 años
Puntos: 2658
Respuesta: Consulta clientes con compras todos los meses

Probablemente.
Como consejo te sugeriría migrar a otro DBMS (el que te convenga), porque la desactualización en este rubro cuesta performance... y mucha.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #9 (permalink)  
Antiguo 31/01/2013, 06:42
 
Fecha de Ingreso: abril-2012
Mensajes: 590
Antigüedad: 12 años, 7 meses
Puntos: 58
Respuesta: Consulta clientes con compras todos los meses

De hecho ya son varias aplicaciones que tengo para quitar informes que tuve que pasar varias tablas a mysql para poder trabajar comodamente porque con dbase me siento muy muy limitado, y mas en mi caso que no domino demasiado las bd.

Lo de migrar por completo imposible porque el programa de gestion que usa la empresa tira de dbase y aunque ya recomende mil y una vez cambiar de sistema no me hacen caso.

De hecho el programa en si también va super lento con mil cuelgues, atasques, problemas por doquier... son mas de 15 personas trabajando a la vez vía escritorio remoto, no imaginas como va. Y cuando me pongo a lanzar consultas algo complejas tiembla.

Es un ERP pensado para empresas de 1-2 personas... es un dolor trabajar con esto.

Gracias por la ayuda, como siempre.
Un saludo

Etiquetas: compras, fecha, meses, select
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 02:59.