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

[SOLUCIONADO] Sentencia SQL condicional

Estas en el tema de Sentencia SQL condicional en el foro de Mysql en Foros del Web. Hola a todos. Tengo una tabla de pagos de la que necesito extraer datos y no lo consigo, ya que requiero una condicional y no ...
  #1 (permalink)  
Antiguo 26/05/2013, 18:32
Avatar de cchaparro  
Fecha de Ingreso: febrero-2009
Ubicación: Medellín
Mensajes: 80
Antigüedad: 15 años, 2 meses
Puntos: 2
Pregunta Sentencia SQL condicional

Hola a todos.

Tengo una tabla de pagos de la que necesito extraer datos y no lo consigo, ya que requiero una condicional y no se cómo se hace, si es que se puede. A modo ejemplo, tendría estos datos:

Fecha Actual Simulada: 26-05-2013
Cliente 1
Fecha Pago
01-01-2013 - 10.000
02-01-2013 - 10.000
03-01-2013 - 10.000
04-01-2013 - 10.000
05-01-2013 - 10.000

Cliente 2
Fecha Pago
24-05-2013 - 10.000
25-05-2013 - 10.000
26-05-2013 - 10.000
27-05-2013 - 10.000
28-05-2013 - 10.000

Lo que necesito es sacar los pagos ya vencidos; lo intento con la siguiente consulta: SELECT * FROM pagos WHERE fecha_pago < '2013-05-26'

En el caso del Cliente 1 son vencidas, está bien, ya que la última fecha de pago es anterior a la fecha actual.
Pero el Cliente 2 no las tiene vencidas, solamente atrasadas, ya que la última fecha de pago es posterior a la fecha actual.

Entonces necesito adicionar una condición a la consulta anterior, que sería seleccionar de pagos todos los registros que sean menores a la fecha actual, PERO que no seleccione los registros que sean iguales o mayores a la fecha actual.

Y eso sería lo que necesito. Estuve mirando cosas como HAVING, NOT IN, EXISTS, pero no logro filtrar correctamente la consulta que preciso. Ya estoy pensando hasta en tomar el array $result de esa consulta y ponerme a eliminar uno por uno los que tengan fechas iguales o mayores a la fecha actual, pero eso ralentizaría mucho el proceso.

Algo debe haber, pero lo desconozco, así que les consulto a ustedes por si tienen alguna solución y así optimizar una consulta adecuadamente, en lugar de ponerme a eliminar desde el array $result.

Les agradezco mucho su ayuda, un saludo.
  #2 (permalink)  
Antiguo 27/05/2013, 01:44
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Sabadell
Mensajes: 4.897
Antigüedad: 16 años, 1 mes
Puntos: 574
Respuesta: Sentencia SQL condicional

Poco muestras de tu estructura pero supongamos que la tabla pagos tiene un campo que indentifique al cliente y que solo quires los pagos de los clientes cuya fecha maxima de pago sea anterior a la actual... luego divide y venceras


Código MySQL:
Ver original
  1. SELECT cliente FROM pagos GROUP BY cliente HAVING max(fecha)<DATE(NOW())

Estos son los clientes a tener en cuenta

Luego

Código MySQL:
Ver original
  1. SELECT * FROM pagos WHERE cliente IN (SELECT cliente FROM pagos GROUP BY cliente HAVING max(fecha)<DATE(NOW()))

Esto da los pagos de los clientes cuya fecha maxima es anterior a la actual....
__________________
Quim
--------------------------------------------------
Ayudar a ayudar es una buena práctica!!! Y da buenos resultados.
  #3 (permalink)  
Antiguo 27/05/2013, 07:35
Avatar de cchaparro  
Fecha de Ingreso: febrero-2009
Ubicación: Medellín
Mensajes: 80
Antigüedad: 15 años, 2 meses
Puntos: 2
Respuesta: Sentencia SQL condicional

Hola quimfv.

Algo así como indicaste ya lo había intentado, aunque con tu claro ejemplo práctico puedo verificar mejor; intenté esto:

SELECT id_pago FROM pagos GROUP BY id_pago HAVING max(fecha_pago)<'2013-05-27'

... pero devuelve como válidos pagos con fecha máxima posterior a la indicada para un mismo cliente. La estructura es la siguiente:
id_pago
id_cliente
fecha_pago
cantidad
estado_pago

Pero supongo que por ese camino va la posible solución. Seguiré haciendo pruebas, aunque ojalá alguien sepa cómo hacer para que funcione.

------------------------------------------------------------------------------------------------------------
SOLUCIONADO:
SELECT * FROM pagos WHERE pagos.estado_pago = 'PENDIENTE' AND id_cliente IN (SELECT id_cliente FROM pagos GROUP BY id_cliente HAVING MAX(fecha_pago)<'2013-05-27')

No había hecho la relación con el cliente, era lógico que devolviera los registros "mal", no estaba aplicando bien la consulta; abrí más la mente a mirar tu segunda consulta y tan obvio como que acabé de madrugar y estaba con los ojos pegados. Sorry. Estuvo excelente tu ayuda, haré unas pruebas más durante esta semana pero gracias por ahora que estoy algo más tranquilo.

Gracias de todo corazón quimfv.

--------------------------------------------------------------------------------------------------------------
Pruebas realizadas, por ahora quedó excelente la consulta; hubo problemas de lentitud, la consulta se demoraba casi 20 segundos para pocos registros; solucionado entre 2 a 3 segundos indexando los campos utilizados en la consulta, esperando que la BD no crezca mucho en tamaño.

Gracias una vez más quimfv. Dios lo bendiga y les bendiga a todos.

Última edición por cchaparro; 27/05/2013 a las 11:06

Etiquetas: condicional, registros, select, sentencia, sql, tabla
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 00:19.