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

Consulta rara en dos tablas access

Estas en el tema de Consulta rara en dos tablas access en el foro de Bases de Datos General en Foros del Web. Hola a todos, estoy trabado en esta consulta, así que apelo al conocimiento de los que aquí estan navegando para ver si me pueden dan ...
  #1 (permalink)  
Antiguo 05/10/2004, 11:57
Avatar de educlon  
Fecha de Ingreso: octubre-2003
Ubicación: Buenos Aires
Mensajes: 35
Antigüedad: 21 años, 1 mes
Puntos: 0
Consulta rara en dos tablas access

Hola a todos, estoy trabado en esta consulta, así que apelo al conocimiento de los que aquí estan navegando para ver si me pueden dan una mano. El tema es el siguiente:

Tengo dos tablas en una BD Access, mas o menos así:

TABLA NOTAS:

| COD_CLIENT | materia | nota |
| 001001 | Geografia | 5 |
| 001001 | Historia | 9 |
| 001001 | Lengua | 7 |
| 001002 | Geografia | 8 |
| 001002 | Historia | 8 |
| 001002 | Lengua | 8 |
| 001003 | Geografia | 8 |
| 001003 | Historia | 10 |
| 001003 | Lengua | 8 |

TABLA CUOTAS:

| COD_CLIENT | tipo | importe |
| 001001 | FAC | 75 |
| 001001 | REC | 75 |
| 001001 | REC | 75 |
| 001002 | FAC | 75 |
| 001002 | REC | 75 |
| 001003 | FAC | 75 |
| 001003 | REC | 75 |
| 001003 | REC | 75 |
| 001003 | REC | 75 |

Son dos tablas de alumnos y sus notas por cada materia, la cantidad de materias varía para cada alumno. En la tabla de CUOTAS , el tipo FAC significa FACTURA y es lo que abona el alumno cuando de inscribe en concepto de matrícula. El tipo REC es un recibo por la cuota de cada materia rendida, y para estar al día debería tener 1 cuota por cada nota, es decir que si hay mas notas que pagos tipo FAC, ese alumno está atrasado.

Necesito que una consulta me recoja solamente aquellos alumnos (COD_CLIENT) cuyas cantidades de notas sean mayores que las cantidades de pagos tipo REC. Usando los datos de las tablas de arriba, me tendría que dar lo siguiente:

|COD_CLIENT|Notas|Pagos|
| 001001 | 3 | 2 |
| 001002 | 2 | 1 |

En los resultados, no debería aparecer el COD_CLIENT 001003 por tener 3 notas y tres pagos del tipo REC.

Si alguien sabe cómo armar esta consulta SQL (la voy a usar en una pagina ASP con Access) se lo voy a agradecer infinitamente.

Saludos a todos...

Última edición por educlon; 05/10/2004 a las 12:40
  #2 (permalink)  
Antiguo 06/10/2004, 02:39
 
Fecha de Ingreso: abril-2003
Ubicación: Madrid
Mensajes: 707
Antigüedad: 21 años, 7 meses
Puntos: 0
La select resultante es un poco enrevesada, si bien se podría simplificar haciendo tres consultas diferentes, con algo así funciona: (creo, sobretodo depende de que versión de access estés utilizando)


SELECT NOTAS.COD_CLIENT, Count(NOTAS.materia) AS NOTAS, First(PAGOS.Pagos) AS Pagos
FROM NOTAS LEFT JOIN (SELECT CUOTAS.COD_CLIENT, Count(CUOTAS.COD_CLIENT) AS Pagos
FROM CUOTAS
WHERE (((CUOTAS.Tipo)="REC"))
GROUP BY CUOTAS.COD_CLIENT) AS PAGOS ON NOTAS.COD_CLIENT = PAGOS.COD_CLIENT
GROUP BY NOTAS.COD_CLIENT
HAVING (((Count(NOTAS.materia))<>First([Pagos])));


Pero si quieres hacerlo más sencillo, primero haz una consulta con el total de asignaturas por alumno, llamémosla MATERIAS

SELECT NOTAS.COD_CLIENT, Count(NOTAS.materia) AS NOTAS
FROM NOTAS GROUP BY NOTAS.COD_CLIENT;

Haz otra consulta para el total de pagos realizados, llamémosla PAGOS

SELECT CUOTAS.COD_CLIENT, Count(CUOTAS.COD_CLIENT) AS Pagos
FROM CUOTAS
WHERE (((CUOTAS.Tipo)="REC"))
GROUP BY CUOTAS.COD_CLIENT;

Y finalmente la que te devuelva la información que pides

SELECT MATERIAS.COD_CLIENT, MATERIAS.NOTAS, PAGOS.Pagos
FROM MATERIAS LEFT JOIN PAGOS ON MATERIAS.COD_CLIENT = PAGOS.COD_CLIENT
WHERE (((MATERIAS.NOTAS)<>[Pagos]));


Con esto te debería valer...

Un saludo
  #3 (permalink)  
Antiguo 12/10/2004, 06:17
Avatar de educlon  
Fecha de Ingreso: octubre-2003
Ubicación: Buenos Aires
Mensajes: 35
Antigüedad: 21 años, 1 mes
Puntos: 0
Muchísimas gracias Teri, esto que me pasaste me fué de gran ayuda, no sólo funcionó a la perfección sinó que también me sirvió de punto de partida para armar otras consultas, además de darme cuenta de lo poco que sé de SQL y de lo mucho que me hace falta profundizar más sobre este tema...

Muchas gracias y saludos...
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 15:37.