SQL - Alumno con mayor promedio por carrera

 
Vista:
sin imagen de perfil
Val: 11
Ha disminuido su posición en 5 puestos en SQL (en relación al último mes)
Gráfica de SQL

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:
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
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Isaias
Val: 2.542
Oro
Ha mantenido su posición en SQL (en relación al último mes)
Gráfica de SQL

Alumno con mayor promedio por carrera

Publicado por Isaias (1921 intervenciones) el 30/09/2020 16:02:33
veo que es una especie de TAREA, ¿que avance llevas?, ¿Cuál es tu motor de base de datos?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 11
Ha disminuido su posición en 5 puestos en SQL (en relación al último mes)
Gráfica de SQL

Alumno con mayor promedio por carrera

Publicado por Antonio (4 intervenciones) el 30/09/2020 17:02:30
Sí, es un ejercicio que me he puesto, estoy practicando Sql. Por cierto se me olvidó comentar que pedían hacerlo sin TOP ni LIMIT.

El motor da igual, el fiddle que he puesto tiene MySQL. Originalmente lo pedían con Sql Server.

Yo no he sido capaz de sacarlo pero han respondido ya la pregunta original. No lo comparto aun por si tenéis otro enfoque, pero doy la pista de que han dado dos soluciones, una con ventanas y otra mas tradicional. Tengo que comprobarlas.

¿Alguna idea?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar