Alumno con mayor promedio por carrera
Publicado por Antonio (4 intervenciones) el 30/09/2020 14:54:09
Hola. Estoy aprendiendo SQL y esta es una consulta que he visto en otro foro pero que no soy capaz de sacar, me la he puesto como ejercicio.
Obtener alumno, carrera y nota promedio, del alumno con mejor nota promedio por carrera:
Antes que nada: he creado un fiddle.
Las tablas:
Es decir, alumno cursa carrera, tiene unas notas por asignatura.
Con datos:
El resultado debería ser (Pedro, 87, Arquitectura) y (Claudia, 91.5, Sistemas).
Solo alcanzo a sacar la nota promedio por alumno:
Pero para quedarme con el máximo pierdo el alumno:
¿Como se hace?
Obtener alumno, carrera y nota promedio, del alumno con mejor nota promedio por carrera:
Antes que nada: he creado un fiddle.
Las tablas:
1
2
3
4
* Carrera (ID, nombre)
* Alumno (ID, nombre, ID_CARRERA)
* Asignatura (ID, nombre)
* Notas (ID_ALUMNO, ID_ASIGNATURA, nota)
Es decir, alumno cursa carrera, tiene unas notas por asignatura.
Con datos:
1
2
3
4
5
6
CARRERA
| ID | nombre |
| --- | ------------ |
| 202 | Informática |
| 204 | Arquitectura |
1
2
3
4
5
6
7
8
ASIGNATURA
| ID | nombre |
| --- | -------------------------------- |
| 101 | Bases de datos |
| 105 | Inteligencia artificial |
| 202 | Ingeniería del Software |
| 303 | Programación orientada a objetos |
1
2
3
4
5
6
7
ALUMNO
| ID | nombre | ID_CARRERA |
| -------- | ------- | ---------- |
| 17100102 | Claudia | 202 |
| 17100254 | Juan | 202 |
| 18100312 | Pedro | 204 |
1
2
3
4
5
6
7
8
9
NOTAS
| ID_ALUMNO | ID_ASIGNATURA | nota |
| --------- | ------------- | ---- |
| 17100102 | 202 | 95 |
| 17100102 | 303 | 88 |
| 17100254 | 101 | 76 |
| 17100254 | 202 | 82 |
| 18100312 | 105 | 87 |
El resultado debería ser (Pedro, 87, Arquitectura) y (Claudia, 91.5, Sistemas).
Solo alcanzo a sacar la nota promedio por alumno:
1
2
3
4
5
6
-- nota promedio por cada alumnno
select a.nombre as Alumno, c.nombre as Carrera, avg(n.nota) as 'Nota promedio'
from alumno a
inner join notas n on (a.id = n.id_alumno)
inner join carrera c on (a.id_carrera = c.id)
group by a.id
1
2
3
4
5
| Alumno | Carrera | Nota promedio |
| ------- | ------------ | ------------- |
| Claudia | Informática | 91.5000 |
| Juan | Informática | 79.0000 |
| Pedro | Arquitectura | 87.0000 |
Pero para quedarme con el máximo pierdo el alumno:
1
2
3
4
5
6
7
8
-- falta enlacer alumno, pero no puedo agrupar por alumno
select p.carrera, max(p.promedio)
from (select a.nombre as Alumno, c.nombre as Carrera, avg(n.nota) as promedio
from alumno a
inner join notas n on (a.id = n.id_alumno)
inner join carrera c on (a.id_carrera = c.id)
group by a.id) as p
group by p.carrera;
1
2
3
4
| carrera | max(p.promedio) |
| ------------ | --------------- |
| Arquitectura | 87.0000 |
| Informática | 91.5000 |
¿Como se hace?
Valora esta pregunta


0