Sumar en consulta de access
Bueno mi pregunta es la siguiente:
Tengo una BBDD de formació la cual tiene 3 tablas:
Alumnos: idalumno, nombre, apellido, email,...
Curso: idCurso, nombre, horas, lugar,...
Alumnos-Curso: idAlumno, idCurso, admitido.
Lo que quiero conseguir es tener una consulta (informe) en la que a la que escoja un curso me aparezcan todos los alumnos inscritos (admitidos i no admitidos) con una tercera parte que sea la suma de horas que ha echo en diferentes cursos.
Me encuentro con el problema que si un alumno no ha estado admitido en ningún curso no aparecería en esta consulta.
No tengo problemas para programar en VB si hiciera falta.
Ejemplo de resultado
Titulo del curso Nombre Horas de cursos acumuladas
Curso de aprendizaje Juan Nadie 30H
Curso de informática pedro mati 0H
Curso de aprendizaje isabel gepet 2H
Tengo una BBDD de formació la cual tiene 3 tablas:
Alumnos: idalumno, nombre, apellido, email,...
Curso: idCurso, nombre, horas, lugar,...
Alumnos-Curso: idAlumno, idCurso, admitido.
Lo que quiero conseguir es tener una consulta (informe) en la que a la que escoja un curso me aparezcan todos los alumnos inscritos (admitidos i no admitidos) con una tercera parte que sea la suma de horas que ha echo en diferentes cursos.
Me encuentro con el problema que si un alumno no ha estado admitido en ningún curso no aparecería en esta consulta.
No tengo problemas para programar en VB si hiciera falta.
Ejemplo de resultado
Titulo del curso Nombre Horas de cursos acumuladas
Curso de aprendizaje Juan Nadie 30H
Curso de informática pedro mati 0H
Curso de aprendizaje isabel gepet 2H
2 Respuestas
Respuesta de dmoran
1
1
dmoran, Estudios: -Licenciado en CC Química, especialidad Química Agrícola
Prueba con dos consultas:
La primera: (ConsultaSumaTotal)
SELECT [alumno-curso].idalumno, alumnos.nombre, Sum(cursos.horas) AS SumaDehoras
FROM ([alumno-curso] INNER JOIN alumnos ON [alumno-curso].idalumno = alumnos.idAlumno) INNER JOIN cursos ON [alumno-curso].idcurso = cursos.idcurso
WHERE ((([alumno-curso].admitido)=True))
GROUP BY [alumno-curso].idalumno, alumnos.nombre;
y la otra
SELECT alumnos.nombre, [alumno-curso].idalumno, IIf([SumaDehoras]>0,[sumadehoras],0) AS suma
FROM ([alumno-curso] LEFT JOIN ConsultaSumaTotal ON [alumno-curso].idalumno = ConsultaSumaTotal.idAlumno) INNER JOIN alumnos ON [alumno-curso].idalumno = alumnos.idAlumno;
He probado con unos pocos y parece que funciona.
Suerte
La primera: (ConsultaSumaTotal)
SELECT [alumno-curso].idalumno, alumnos.nombre, Sum(cursos.horas) AS SumaDehoras
FROM ([alumno-curso] INNER JOIN alumnos ON [alumno-curso].idalumno = alumnos.idAlumno) INNER JOIN cursos ON [alumno-curso].idcurso = cursos.idcurso
WHERE ((([alumno-curso].admitido)=True))
GROUP BY [alumno-curso].idalumno, alumnos.nombre;
y la otra
SELECT alumnos.nombre, [alumno-curso].idalumno, IIf([SumaDehoras]>0,[sumadehoras],0) AS suma
FROM ([alumno-curso] LEFT JOIN ConsultaSumaTotal ON [alumno-curso].idalumno = ConsultaSumaTotal.idAlumno) INNER JOIN alumnos ON [alumno-curso].idalumno = alumnos.idAlumno;
He probado con unos pocos y parece que funciona.
Suerte
Un momento, no entiendo.
Quieres esto:
Titulo del curso Nombre Horas de cursos acumuladas
Curso de aprendizaje Juan Nadie 30H
Curso de informática pedro mati 0H
Curso de aprendizaje isabel gepet 2H
Pero, ¿un alumno hace UN curso MÁS DE Una vez?
Si no es así, por qué, entonces, Juan ha hecho el mismo curso que Isabel, ¿pero tienen diferentes horas?
Quieres esto:
Titulo del curso Nombre Horas de cursos acumuladas
Curso de aprendizaje Juan Nadie 30H
Curso de informática pedro mati 0H
Curso de aprendizaje isabel gepet 2H
Pero, ¿un alumno hace UN curso MÁS DE Una vez?
Si no es así, por qué, entonces, Juan ha hecho el mismo curso que Isabel, ¿pero tienen diferentes horas?
Muchas gracias por tu rapidez, aclaro unas cosas.
Lo que quería es que en la consulta me salgan todos los que aparecen en la tabla alumnos-cursos, la columna suma de horas es una suma total (de todos los cursos que lleva) pero solo los cursos donde sea admitido (admitido=Verdadero)
i los cursos que no este admitido no suman para el total de horas.
El caso que em comentabas crec que se responde con lo de arriba, el caso de pedro por ejemplo es porque no ha estado admitido en ningún curso aunque si que esta apuntado...
Espero haber-me explicado bien.
Probaré con tu solución ^_^
Gracias.
Lo que quería es que en la consulta me salgan todos los que aparecen en la tabla alumnos-cursos, la columna suma de horas es una suma total (de todos los cursos que lleva) pero solo los cursos donde sea admitido (admitido=Verdadero)
i los cursos que no este admitido no suman para el total de horas.
El caso que em comentabas crec que se responde con lo de arriba, el caso de pedro por ejemplo es porque no ha estado admitido en ningún curso aunque si que esta apuntado...
Espero haber-me explicado bien.
Probaré con tu solución ^_^
Gracias.
Si la respuesta es fácil... se quiere saber las horas que ha echo en formación cada alumno para que el que menos tenga sea el que sea admitido.
Todo eso sin tener que cambiar de formulario...
Así cuando le des a buscar alumnos de un curso te salga el curso i todos los alumnos (admitidos i no admitidos) i con las horas totales que lleva (pero solo suman las horas de los cursos donde ha estado admitido)
esto es básicamente porque en una sola consulta el alumno que no haya echo ningún curso no saldría...
select alumno, curso, sum(horas) from alumnos,.... where admitido=si
este caso seria en el que un alumno que acaba de llegar no saldria ya que no ha estado admitido en ningun curso i no puede sumar horas i tendria que salit 0h en su comput...
Creo que ha quedado un poco más claro.
Muchas gracias
Todo eso sin tener que cambiar de formulario...
Así cuando le des a buscar alumnos de un curso te salga el curso i todos los alumnos (admitidos i no admitidos) i con las horas totales que lleva (pero solo suman las horas de los cursos donde ha estado admitido)
esto es básicamente porque en una sola consulta el alumno que no haya echo ningún curso no saldría...
select alumno, curso, sum(horas) from alumnos,.... where admitido=si
este caso seria en el que un alumno que acaba de llegar no saldria ya que no ha estado admitido en ningun curso i no puede sumar horas i tendria que salit 0h en su comput...
Creo que ha quedado un poco más claro.
Muchas gracias
Entonces, no entiendo el porqué del campo 'Titulo del curso', ya que después está el campo suma de horas de todos los cursos. O se me escapa algo o no le veo mucho sentido :-S
Je je vale, porque previamente puedas escoger el curso sobre el que te quieras cenrtar... es decir en un formulario previo escogeré un curso i después me saldrán los alumnos de aquel curso con las horas que tienen acumuladaas, para poder escoger quien esta o queda admitido i quien no...
Una possible solución que se me acaba de ocurrir es añadir el campo (horas totales) en la tabla alumnos i actualizarlo cada vez que pulse ha admitido.
¿Aunque no me gusta ya que tendría que poder calcular-se no?
¿Aunque no me gusta ya que tendría que poder calcular-se no?
Creo que el curso no podría salir directamente de la consulta, ya que quieres la suma del campo 'horas' para VARIOS cursos. Se podría, pero entonces te saldría por duplicado, a ver si me explico: imaginemos que el curso de aprendizaje es de 2h y otro de Química es de 28, y Juan ha hecho los dos; entonces tendríamos:
Titulo del curso Nombre Horas de cursos acumuladas
Curso de aprendizaje Juan Nadie 30H
Curso de química Juan Nadie 30H
Curso de informática pedro mati 0H
Curso de aprendizaje isabel gepet 2H
Podríamos modificar la segunda consulta con el criterio del curso, quedando (imaginemos que el id del curso que queremos es el 3:
SELECT alumnos.nombre, [alumno-curso].idalumno, cursos.nombrecurso, IIf([SumaDehoras]>0,[sumadehoras],0) AS suma FROM (([alumno-curso] LEFT JOIN Consulta2 ON [alumno-curso].idalumno = Consulta2.idAlumno) INNER JOIN alumnos ON [alumno-curso].idalumno = alumnos.idAlumno) INNER JOIN cursos ON [alumno-curso].idcurso = cursos.idcurso
WHERE ((([alumno-curso].idcurso)=3));
(Si no quieres filtrar por curso, pues omites la clausula where).
Suerte
Titulo del curso Nombre Horas de cursos acumuladas
Curso de aprendizaje Juan Nadie 30H
Curso de química Juan Nadie 30H
Curso de informática pedro mati 0H
Curso de aprendizaje isabel gepet 2H
Podríamos modificar la segunda consulta con el criterio del curso, quedando (imaginemos que el id del curso que queremos es el 3:
SELECT alumnos.nombre, [alumno-curso].idalumno, cursos.nombrecurso, IIf([SumaDehoras]>0,[sumadehoras],0) AS suma FROM (([alumno-curso] LEFT JOIN Consulta2 ON [alumno-curso].idalumno = Consulta2.idAlumno) INNER JOIN alumnos ON [alumno-curso].idalumno = alumnos.idAlumno) INNER JOIN cursos ON [alumno-curso].idcurso = cursos.idcurso
WHERE ((([alumno-curso].idcurso)=3));
(Si no quieres filtrar por curso, pues omites la clausula where).
Suerte
Por cierto, se me ha ido el nombre; en lugar de 'Consulta2' deberás poner el nombre que hayas dado a la consulta anterior, que yo te puse ConsultaSumaTotal
Quedaría:
SELECT alumnos.nombre, [alumno-curso].idalumno, cursos.nombrecurso, IIf([SumaDehoras]>0,[sumadehoras],0) AS suma FROM (([alumno-curso] LEFT JOIN ConsultaSumaTotal ON [alumno-curso].idalumno = ConsultaSumaTotal.idAlumno) INNER JOIN alumnos ON [alumno-curso].idalumno = alumnos.idAlumno) INNER JOIN cursos ON [alumno-curso].idcurso = cursos.idcurso
WHERE ((([alumno-curso].idcurso)=3));
Sort
Quedaría:
SELECT alumnos.nombre, [alumno-curso].idalumno, cursos.nombrecurso, IIf([SumaDehoras]>0,[sumadehoras],0) AS suma FROM (([alumno-curso] LEFT JOIN ConsultaSumaTotal ON [alumno-curso].idalumno = ConsultaSumaTotal.idAlumno) INNER JOIN alumnos ON [alumno-curso].idalumno = alumnos.idAlumno) INNER JOIN cursos ON [alumno-curso].idcurso = cursos.idcurso
WHERE ((([alumno-curso].idcurso)=3));
Sort
Va por aquí, no hace falta que el curso salga ya que se puede filtrar por curso (normalmente así sera)
Me pongo con la opción que dices haber que tal
muchissima gracias ^_^
Me pongo con la opción que dices haber que tal
muchissima gracias ^_^
He puesto esto:
SELECT ALUMNES.[Nom alumne], [ALUMNES_CURSOS].IdAlumne, cursos.[nom curs], IIf([SumaDehoras]>0,[sumadehoras],0) AS suma
FROM ((([ALUMNES_CURSOS]
LEFT JOIN ConsultaSumaTotal ON [ALUMNES_CURSOS].IdAlumne = ConsultaSumaTotal.idAlumne)
INNER JOIN alumnes ON [ALUMNES_CURSOS].idAlumne = ALUMNES.id)
INNER JOIN cursos ON [ALUMNES_CURSOS].idcurs = cursos.[codi Curs])
WHERE ((([ALUMNES_CURSOS].idcurs)="09GS01"));
(Copiar pegar de tal i como es)
Me dice: "Ha intentado ejecutar una consulta que no incluye la expresión especificada 'nom alumne' como parte de una función de agregado.
A la que le añado
GROUP BY alumnes.[nom Alumne];
Me dice lo mismo...
No se como solucionar-lo...
P.D. No sabia que podías poner un if en una consulta :P
Gracias otra vez
SELECT ALUMNES.[Nom alumne], [ALUMNES_CURSOS].IdAlumne, cursos.[nom curs], IIf([SumaDehoras]>0,[sumadehoras],0) AS suma
FROM ((([ALUMNES_CURSOS]
LEFT JOIN ConsultaSumaTotal ON [ALUMNES_CURSOS].IdAlumne = ConsultaSumaTotal.idAlumne)
INNER JOIN alumnes ON [ALUMNES_CURSOS].idAlumne = ALUMNES.id)
INNER JOIN cursos ON [ALUMNES_CURSOS].idcurs = cursos.[codi Curs])
WHERE ((([ALUMNES_CURSOS].idcurs)="09GS01"));
(Copiar pegar de tal i como es)
Me dice: "Ha intentado ejecutar una consulta que no incluye la expresión especificada 'nom alumne' como parte de una función de agregado.
A la que le añado
GROUP BY alumnes.[nom Alumne];
Me dice lo mismo...
No se como solucionar-lo...
P.D. No sabia que podías poner un if en una consulta :P
Gracias otra vez
SELECT [ALUMNES_CURSOS].idAlumne, ALUMNES.[nom alumne], Sum(CURSOS.[Nombre hores]) AS SumaDehoras
FROM ([ALUMNES_CURSOS] INNER JOIN ALUMNES ON [ALUMNES_CURSOS].idAlumne = ALUMNES.ID) INNER JOIN CURSOS ON [ALUMNES_CURSOS].idcurs = cursos.[Codi curs]
WHERE ((([ALUMNES_CURSOS].admes)=True))
GROUP BY [ALUMNES_CURSOS].idalumne, alumnes.[nom Alumne];
Es esta i funciona correctamente (muestra la suma de las horas de los alumnos admitidos) asta aquí lo había conseguido, el problema llega al querer incorporar los que no están admitidos (que no sume vaia) i muestre 0 en caso que no estén admitidos en ningún curso (alumnos nuevos)
FROM ([ALUMNES_CURSOS] INNER JOIN ALUMNES ON [ALUMNES_CURSOS].idAlumne = ALUMNES.ID) INNER JOIN CURSOS ON [ALUMNES_CURSOS].idcurs = cursos.[Codi curs]
WHERE ((([ALUMNES_CURSOS].admes)=True))
GROUP BY [ALUMNES_CURSOS].idalumne, alumnes.[nom Alumne];
Es esta i funciona correctamente (muestra la suma de las horas de los alumnos admitidos) asta aquí lo había conseguido, el problema llega al querer incorporar los que no están admitidos (que no sume vaia) i muestre 0 en caso que no estén admitidos en ningún curso (alumnos nuevos)
Añadiendo esto:
GROUP BY alumnes.[nom Alumne], [ALUMNES_CURSOS].IdAlumne, cursos.[nom curs],sumadehoras;
Da un resultado pero no el deseado ya que los no admitidos no los muestra...
GROUP BY alumnes.[nom Alumne], [ALUMNES_CURSOS].IdAlumne, cursos.[nom curs],sumadehoras;
Da un resultado pero no el deseado ya que los no admitidos no los muestra...
Te paso mis dos consultas, a mí me está funcionando
Primera
SELECT [ALUMNES_CURSOS].[idAlumne], [ALUMNES].[nom alumne], Sum([CURSOS].[Nombre hores]) AS SumaDehoras
FROM (ALUMNES_CURSOS INNER JOIN ALUMNES ON [ALUMNES_CURSOS].[idAlumne]=[ALUMNES].[ID]) INNER JOIN CURSOS ON [ALUMNES_CURSOS].[idcurs]=[cursos].[Codi curs]
WHERE ((([ALUMNES_CURSOS].[admes])=True))
GROUP BY [ALUMNES_CURSOS].[idalumne], [alumnes].[nom Alumne];
(Guardada como ConsultaSumaTotal)
Segunda
SELECT alumnes.[nom alumne], alumnes_cursos.idalumne, cursos.[nom curs], IIf([SumaDehoras]>0,[sumadehoras],0) AS Expr1
FROM ((alumnes_cursos
LEFT JOIN ConsultaSumaTotal ON alumnes_cursos.idalumne = ConsultaSumaTotal.idAlumne)
INNER JOIN alumnes ON alumnes_cursos.idalumne = alumnes.id) INNER JOIN cursos ON alumnes_cursos.idcurs = cursos.[codi curs]
Primera
SELECT [ALUMNES_CURSOS].[idAlumne], [ALUMNES].[nom alumne], Sum([CURSOS].[Nombre hores]) AS SumaDehoras
FROM (ALUMNES_CURSOS INNER JOIN ALUMNES ON [ALUMNES_CURSOS].[idAlumne]=[ALUMNES].[ID]) INNER JOIN CURSOS ON [ALUMNES_CURSOS].[idcurs]=[cursos].[Codi curs]
WHERE ((([ALUMNES_CURSOS].[admes])=True))
GROUP BY [ALUMNES_CURSOS].[idalumne], [alumnes].[nom Alumne];
(Guardada como ConsultaSumaTotal)
Segunda
SELECT alumnes.[nom alumne], alumnes_cursos.idalumne, cursos.[nom curs], IIf([SumaDehoras]>0,[sumadehoras],0) AS Expr1
FROM ((alumnes_cursos
LEFT JOIN ConsultaSumaTotal ON alumnes_cursos.idalumne = ConsultaSumaTotal.idAlumne)
INNER JOIN alumnes ON alumnes_cursos.idalumne = alumnes.id) INNER JOIN cursos ON alumnes_cursos.idcurs = cursos.[codi curs]
- Compartir respuesta
- Anónimo
ahora mismo
Respuesta de xavi -ae soft-
1
1
xavi -ae soft-, 20años de experiencia en programacion Access a razon de 10 horas...
Me parece que el "error" se encuentra a la hora de relacionar las tablas en la consulta.
La tabla Alumnos-Curso debe mostrar todos los registros y, para ello, su relación con las otras tablas debe ser: Mostrar todos los registros de Alumnos-Curso y aquelllos de (la otra tabla) que coincidan.
Prueba y cuentas.
La tabla Alumnos-Curso debe mostrar todos los registros y, para ello, su relación con las otras tablas debe ser: Mostrar todos los registros de Alumnos-Curso y aquelllos de (la otra tabla) que coincidan.
Prueba y cuentas.
Mmmmm no, las relaciones están bien echas,
son tres tablas 2 grandes (alumnos i cursos) i la alumnos-cursos que se genera a partir de la relación n-m entre alumnos i cursos.
son tres tablas 2 grandes (alumnos i cursos) i la alumnos-cursos que se genera a partir de la relación n-m entre alumnos i cursos.
La tabla "Principal" es, a mi entender, la de Alumnos-Cursos, ya que es la que contiene todos los registros que quieres mostrar... ¿o no es asi?
Xavi
Xavi
Es la importante con relaciones 1-n en tre la alumnos-cursos i cursos i alumnos-cursos alumnos...
Desde allí cojo todos los alumnos que estén apuntados en un curso (admitidos o no)
i después al escoger un curso (por ejemplo) quiero que me muestre todos los alumnos que estén apuntados i un campo con las horas que tenga acumuladas(de todos los cursos que ha estado admitido) para escoger al que tenga menos horas para admitirlo.
El problema es que si hay un alumno nuevo(que no este admitido en ningún curso) no me saldría en una primera consulta, a no ser que encuentre la respuesta...
Desde allí cojo todos los alumnos que estén apuntados en un curso (admitidos o no)
i después al escoger un curso (por ejemplo) quiero que me muestre todos los alumnos que estén apuntados i un campo con las horas que tenga acumuladas(de todos los cursos que ha estado admitido) para escoger al que tenga menos horas para admitirlo.
El problema es que si hay un alumno nuevo(que no este admitido en ningún curso) no me saldría en una primera consulta, a no ser que encuentre la respuesta...
- Compartir respuesta
- Anónimo
ahora mismo