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

Duda para Obtener promedio mas alto

Estas en el tema de Duda para Obtener promedio mas alto en el foro de Mysql en Foros del Web. Hey que tal comunidad... Estoy repasando SQL en la escuela y haciendo unas consultas, tengo una base en MySQL llamado alumnos, con cuatro tablas 1-alumno ...
  #1 (permalink)  
Antiguo 20/01/2012, 02:01
 
Fecha de Ingreso: julio-2010
Mensajes: 23
Antigüedad: 13 años, 8 meses
Puntos: 0
Pregunta Duda para Obtener promedio mas alto

Hey que tal comunidad...

Estoy repasando SQL en la escuela y haciendo unas consultas, tengo una base en MySQL llamado alumnos, con cuatro tablas 1-alumno 2- materia 3- alumnomateria 4- cursos. En la tabla alumno materia tengo los campos


alumnomateria
-----------------------------------------------------------------------------------------
matricula [int] | claveMateria [foranea, int] | calificacion [double]
-----------------------------------------------------------------------------------------
1---------------------------------1---------------------------------------9
2---------------------------------2--------------------------------------10
3---------------------------------3---------------------------------------8
1---------------------------------3---------------------------------------9
2---------------------------------1--------------------------------------10
3---------------------------------2---------------------------------------6
1---------------------------------2--------------------------------------10
2---------------------------------3--------------------------------------10
3---------------------------------1---------------------------------------8
-----------------------------------------------------------------------------------------

alumno
-----------------------------------------------------------------------------------------------------
matricula | nombre | domicilio | telefono | numHermanos | claveCurso
-----------------------------------------------------------------------------------------------------
1-----------------Cesar-----------SJR---------112545------------1------------------1
2-----------------Wendolin------SJR---------147485-------------3------------------2
3-----------------Erick------------HID---------578445------------1------------------1
-----------------------------------------------------------------------------------------------------

materia
-------------------------------------------------------------------
claveMateria [PK] | nombreMateria | tipoMateria
-------------------------------------------------------------------
1--------------------------Matematicas-----------------TP
2--------------------------Programacion----------------P
3--------------------------Base de datos---------------TP



Necesito hacer la consulta:

Buscar a los alumnos con los promedios mas altos de cada materia

Para lo cual hice estas consultas:

SELECT A.nombre, A.matricula, AVG(N.calificacion) promedio
FROM alumno A, alumnomateria N, materia M
WHERE A.matricula = N.matricula
AND N.claveMateria = M.claveMateria
GROUP BY (M.nombreMateria) HAVING MAX(promedio)

------------------------------------------------------------------------------------------

SELECT A.nombre, A.matricula, AVG( N.calificacion ) promedio
FROM alumno A, alumnomateria N
WHERE A.matricula = N.matricula GROUP BY(A.matricula)
HAVING MAX( promedio )


pero no me obtienen ningun registro!! y me da este mensaje:

MySQL ha devuelto un conjunto de valores vacío (es decir: cero columnas). ( La consulta tardó 0.0012 seg )

Tambien lo intente asi y me obtiene un resultado pero me obtiene Cesar con un promedio de 8.23, lo cual no es el resultado correcto, y creo yo que lo que hace es sacar el promedio de todos los promedios....

SELECT A.nombre, A.matricula, AVG( N.calificacion ) promedio
FROM alumno A, alumnomateria N, materia M
WHERE A.matricula = N.matricula
AND N.claveMateria = M.claveMateria
HAVING MAX( promedio )
---------------------------------------------------------------------------------------------------

¿Podrian ayudarme a realizar esta consulta?

¿Que es lo que hago mal o en que me equivoco?


De antemano, gracias por sus respuestas.
Saludos

Última edición por Fozziepupus; 20/01/2012 a las 02:08 Razón: Tablas
  #2 (permalink)  
Antiguo 20/01/2012, 03:09
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Sabadell
Mensajes: 4.897
Antigüedad: 16 años, 1 mes
Puntos: 574
Respuesta: Duda para Obtener promedio mas alto

Cita:
¿Podrian ayudarme a realizar esta consulta?
Si, pero no hacerla!!!!

Quita el HAVING ... Tu query te da la lista de alumnos con su promedio... luego solo tines que ordenarlos por el promedio descendente y listar los primeros.... no, o el primero si quieres solo el maximo....

Tambien se puede usar esa query como subquery para obtener el maximo.... con ese valor puedes encontrar todos los alumnos con esa nota....

Analiza lo que has hecho, para que pones la tabla "materia" en la query...? que estas mostrando de ella?

Usa INNER JOIN ... ON para relacionar las tablas y quita ese WHERE....


Cita:
¿Que es lo que hago mal o en que me equivoco?
Al agrupar por alumno puedes obtener el AVG del alumno, el promedio de cada grupo. Estaras agrupando notas y calculando la media de esas notas para cada alumno. Como estas usando MAX tambien seria el MAX de cada grupo es decir del alumno, ya que pides el MAX del mismo grupo de notas que antes. Solo te saldria algun dato si las notas de un alumno fueran todas iguales con lo que su AVG y su MAX serian iguales...

A ti te interesa el AVG de cada alumno y el MAX de los AVG de todos los alumnos... ves la diferencia?

Sigue los links y estudia un poco.... es norma de la casa FdW no hacer tareas de cole si ayudar a estudiar....
__________________
Quim
--------------------------------------------------
Ayudar a ayudar es una buena práctica!!! Y da buenos resultados.

Última edición por quimfv; 20/01/2012 a las 07:27
  #3 (permalink)  
Antiguo 20/01/2012, 15:14
 
Fecha de Ingreso: julio-2010
Mensajes: 23
Antigüedad: 13 años, 8 meses
Puntos: 0
De acuerdo Respuesta: Duda para Obtener promedio mas alto

OK, muchas gracias por tu respuesta quimfv, y mi intencion no fue nunca que me hicieran el query, solo que me apoyaran en como realizarla o en donde tenia el error...


Ahora, tu ayuda me resulto muy util, ya consegui obtener el promedio mas alto, pero tu me preguntabas para que usaba la tabla materia en el query, la razon es que en ese momento no la usaba para nada, pero la consulta que tenia que hacer era "Obtener el promedio mas alto de 'cada' materia" entonces tenia que obtener el promedio alto de cada materia que tengo, por eso ponia la tabla materia y para obtener el nombre de la materia tambien.

muchas gracias...


Nooooo!!!! mentira aun no obtengo los promedios mas altos de cada materia, lo que hace el query que hice después de tu respuesta no me funciono, lo que me hace es obtener el promedio de cada materia pero sin importar que no sea el mismo alumno:

ejemplo:

si tengo a Cesar con calificación en Base de Datos = 9 y a Wendolin con 7 y Erick 7 me obtiene el promedio de estas 3 calificaciones y se las asigna a Cesar, y así con las demás, lo cual es incorrecto, tendría que ser promedio Cesar 9 y este aparecer como mas alto, pero me muestra 7.6666 que es el de las tres...

Revisare lo demás que me decías, y veré si puedo entender mejor... Disculpa pero estoy aprendiendo, perdón...

Última edición por Fozziepupus; 20/01/2012 a las 15:38 Razón: Comprobación de mi respuesta como incorrecta
  #4 (permalink)  
Antiguo 21/01/2012, 04:42
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Sabadell
Mensajes: 4.897
Antigüedad: 16 años, 1 mes
Puntos: 574
Respuesta: Duda para Obtener promedio mas alto

Quizas te he liado, no se porque pense que querias el alumno con la media mas alta....

El analisis és el mismo cambiando el grupo de notas sobre el que haces calculos,

si quieres la media de un alumno tienes que agrupar notas por alumno (GROUP BY matricula)

si quieres la nota media en una materia tienes que agrupar por materia (GROUP BY claveMateria)

si quieres el alumno con la nota maxima en una materia tines que obtener el maximo de el gurpo anterior (notas de una materia) y luego usarlo para seleccionar el alumno con esa nota...

si quieres la materia donde el alumno saca la nota mas alta tines que obtener el maximo del primer gurpo (notas de un alumno) y luego usarlo para seleccionar la materia con esa nota... es question de subquerys...

No intentes sacarlo todo a la vez... si puedes sacar la nota media y la nota maxima de una materia, o de qualquier grupo de notas, en una sola query pero no el nombre del alumno con esa nota maxima...

Yo intentaria hacer las query que te den cada uno de los resultados que busques por separado y luego intenta montar una "super"query usandolas como subquerys... estableciendo relaciones entre ellas (join ... on)

SELECT lista de campos de sbc1 y/o sbc2
FROM (SELECT ... una subquery...) sbc1 JOIN (SELECT ... otra sub query...) sbc2 ON la relacion entre sbc1 y sbc2
...

Dentro de las subquerys puedes tener otras subquerys....

Y una vez tengas el resultado analiza si puedes simplificar algo.

Hasta ahi puedo leer.... suerte.
__________________
Quim
--------------------------------------------------
Ayudar a ayudar es una buena práctica!!! Y da buenos resultados.

Última edición por quimfv; 21/01/2012 a las 04:52
  #5 (permalink)  
Antiguo 26/01/2012, 13:36
 
Fecha de Ingreso: julio-2010
Mensajes: 23
Antigüedad: 13 años, 8 meses
Puntos: 0
Respuesta: Duda para Obtener promedio mas alto

Que tal, gracias de nuevo por tu respuesta, y disculpa no haber contestado antes pero me encontraba atareado con otros cosas...


OK, me esta costando mucho esta consulta, tanto que aun no logro hacerla, intentare aplicar lo que me comentas y veré si puedo lograr obtener lo que necesito.

Muchas gracias, lo intento y te comento que paso, gracias y saludos.

Etiquetas: sql
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 16:28.