0

Tengo una tabla de facturas donde se registran todas las facturas de los estudiantes tanto nuevas como viejas y en mi programa en java tengo una ventana de deudores donde quiero que aparezcan solo los que no tienen una factura que contenga el mes actual... En el código que muestro a continuación ya logré que me muestre las fechas solo de el mes pasado y la mayor de todas la que ese representante ha pagado, pero me aparece la factura anterior del representante que ya tiene una factura pagada de este mes, solo quiero que ya no me aparezca porque ya pagó. Espero puedan ayudarme de verdad no se me ocurre que hacer, muchas gracias de antemano.

SELECT
      estudiantes.cie,
      estudiantes.nombres,
      estudiantes.apellidos,
      representantes.contacto,
      representantes.nombres,
      representantes.apellidos, 
      max(Fecha) AS max_fecha 

FROM facturas, estudiantes, representantes 

WHERE estudiantes.cie = facturas.estudiante AND
      representantes.cir = facturas.representante AND
      month(fecha) + 1 = month(now()) 

GROUP BY estudiante;

Tabla de facturas

Tabla estudiantes

PD:No se si les sirva esta información.

Anexo un ejemplo de la situación que se me presenta:

En mi tabla facturas estan: 
-Juan con una factura del 01/05/2021
-Luis con dos facturas una del 01/05/2021 y otra del 01/06/2021 (mes actual)
Cuando ejecuto mi sentencia el resultado es:
-Juan 01/05/2021
-Luis 01/05/2021
El resultado que quisiera que apareciera es:
-Juan 01/05/2021
(No debería aparecer ninguna factura de Luis)
LordTomas
  • 13
  • 5
  • Deberías evitar el uso de [*joins implícitos*](https://es.stackoverflow.com/questions/52530/cual-es-la-diferencia-entre-joins-impl%c3%adcitos-y-expl%c3%adcitos) así como leer [este recurso respecto a agrupar](https://es.stackoverflow.com/questions/243344/group-by-de-mysql-obliga-a-meter-todos-los-campos-del-select) y ya de paso delimitar si usas mysql o sql server – BetaM Jul 05 '21 at 23:11
  • No conozco tu modelo de datos, pero para que no aparezcan las facturas ya pagadas deberías filtrar en el WHERE utlizando la columna que tenga ese dato. Deberías agregar la estructura de tus tablas (CREATE TABLE) y un [ejemplo mínimo verificable](https://es.stackoverflow.com/help/minimal-reproducible-example). ¿Estás utilizando MySQL o sql-server? – nachospiu Jul 05 '21 at 23:13
  • entiendo lo que dices de añadir un factor para validar las que son vigentes y no, pero quisiera para simplificar que solo me tome la fecha del ultimo registro de ese estudiante ignorando las pasadas que están en esa misma tabla (dicha tabla tiene todas las facturas de mi base de datos), y su modelo seria: ref (pk),estudiante (fk) y fecha de factura (de forma resumida). uso MySql – LordTomas Jul 05 '21 at 23:25
  • @LordTomas no es eso lo que dije. Tampoco entiendo cual es el requerimiento, y sigo sin conocer tu modelo de datos (estructura de las tablas) por lo cual es muy dificil poder dar una repsuesta correcta. – nachospiu Jul 06 '21 at 12:41
  • lo siento si confundí lo que me intentabas decir, soy nuevo en todo esto y no entiendo mucho algunas cosas de esta web, aún me estoy adaptando, trataré de añadir información de mis tablas, que en este caso las importantes son facturas y estudiantes, ya que en facturas la única clave foránea que no cambiará es la del estudiante en la tabla facturas , lo que quiero es agrupar todas las facturas que poseen la clave foranea del estudiante y tomar solo la que tenga la fecha mayor para así poder decir que si tiene el mes actual que no aparezca nada de ese estudiante. @nachospiu – LordTomas Jul 07 '21 at 02:15
  • @LordTomas no te hagas problema, de a poco iras aprendiendo como preguntar. Creo que ahora entendí el requerimiento. Ten en cuenta para la próxima pregunta que es mejor compartir el sql de los CREATE TABLE (en lugar de una foto) y las queries INSERT de algunos datos de ejemplo, para que podamos probar nuestras queries. – nachospiu Jul 07 '21 at 12:11

2 Answers2

0

Si entiendo bien tu pregunta, necesitas un listado con los estudiantes que no tienen factura registrada en el mes actual. Corrígeme si me equivoco.

Esto lo puedes lograr con LEFT JOIN entre la tabla de estudiantes y facturas. En un caso hipotético debería funcionar de la siguiente forma:

SELECT a.nombres, b.fecha
FROM estudiantes a
LEFT JOIN facturas b ON a.documento = b.documento 
WHERE MONTH(b.fecha) = MONTH(NOW())
AND b.fecha IS NULL

En mySql, este query te debería mostrar un listado con los nombres de los estudiantes de la tabla a estudiantes cuyo campo fecha en la tabla b facturas para el mes actual, es igual a NULL

DjCrazy
  • 4,786
  • 3
  • 13
  • 33
  • Has entendido lo que busco, realmente agradecido. Si, lo que busco es que me aparezca una lista de los estudiantes que no tengan facturas registradas de el mes actual, en mi código coloco la condición "month(fecha) + 1 = month(now()) " para que no me coloque las que son muy antiguas, el problema radica en que tengo dos facturas por ejemplo, una del mes del mes pasado y otra del mes actual (las dos del mismo estudiante) y cuando los "filtro", no me aparece la actual pero si la antigua, la cual no quiero que aparezca porque ya hay una factura con la misma FK y posee una fecha que es mayor a esa. – LordTomas Jul 07 '21 at 02:06
  • Muchas gracias amigo, su respuesta estuvo muy cerca de resolver el problema, gracias a usted logré intentar darme un poco mas a entender! – LordTomas Jul 08 '21 at 02:11
0

Con esta query obtienes todos los estudiantes que no tienen facturas en el mes actual:

SELECT *
FROM estudiantes e
LEFT JOIN facturas f ON e.cie = f.estudiante AND MONTH(f.fecha) = MONTH(NOW())
WHERE f.fecha IS NULL;

Resultado (según tus datos de ejemplo, suponiendo mes actual Junio): Será la información del estudiante 'Juan' pero sin información de la última factura.

Según el resultado deseado de tu pregunta pareciera que tu quieres obtener la última factura de aquellos estudiantes que no tengan factura en el mes actual, entonces lo podrías hacer de esta forma:

SELECT e.nombres, f.max_fecha
FROM estudiantes e
LEFT JOIN (SELECT estudiante, MAX(FECHA) AS max_fecha
           FROM facturas
           GROUP BY estudiante) AS f ON e.cie = f.estudiante
WHERE MONTH(f.max_fecha) != MONTH(NOW()) OR f.max_fecha IS NULL;

ó

SELECT e.nombres, MAX(f.fecha) AS max_fecha
FROM estudiantes e
LEFT JOIN facturas f ON e.cie = f.estudiante
GROUP BY e.nombres
HAVING MONTH(max_fecha) != MONTH(NOW()) OR max_fecha IS NULL;

Ten en cuenta que al hacer LEFT JOIN y agregar OR f.max_fecha IS NULL traerá también los estudiantes que no tienen ninguna factura. Si no necesitas esta información puedes sacar el OR f.max_fecha IS NULL y vincular con INNER JOIN.

Resultado (según tus datos de ejemplo, suponiendo mes actual Junio):

nombres max_fecha
Juan 2021-05-01
nachospiu
  • 2,454
  • 2
  • 3
  • 14