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

Sacar la media máxima de varias columnas

Estas en el tema de Sacar la media máxima de varias columnas en el foro de Mysql en Foros del Web. Soy un poco nueva en esto, así que disculpad mi ignorancia; Tengo una tabla como esta: ALUMNO | NIF | nota1 | nota2 | nota3|........ ...
  #1 (permalink)  
Antiguo 21/01/2012, 07:12
 
Fecha de Ingreso: enero-2012
Mensajes: 4
Antigüedad: 12 años, 3 meses
Puntos: 0
Pregunta Sacar la media máxima de varias columnas

Soy un poco nueva en esto, así que disculpad mi ignorancia;

Tengo una tabla como esta:

ALUMNO | NIF | nota1 | nota2 | nota3|........
Maria |1234 | 5 | 6 | 7 |
Pepe |1235 | 3 | 8 | 6 |

La tabla tiene hasta nota 10 y tiene unas 500 tuplas. NIF es la primary key de la tabla.

Cada nota corresponde a una asignatura y lo que necesito hacer es sacar la media de todos los alumnos en cada asignatura (eso ya lo he conseguido) y ver cual es la máxima de todas ellas y esto último es lo que no he conseguido, a ver si alguien puede echarme una manilla
  #2 (permalink)  
Antiguo 21/01/2012, 07:31
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Sacar la media máxima de varias columnas

Ese tipo de consultas son muy sencillas, se realizan realizando un agrupamiento (GROUP BY), usando la función AVG() sobre el campo nota. Las puedes encontrar en cualquier tutorial.
El problema para ayudarte es que la tabla que nos muestras no tiene forma de reconocer a qué asignatura pertenece qué nota. Si la nota no aparece relacionada con la materia en esa tabla (FK) o con el curso o lo que sea, no se puede hacer ningún calculo.

Postea la estructura real de esa tabla.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #3 (permalink)  
Antiguo 21/01/2012, 08:01
 
Fecha de Ingreso: enero-2012
Mensajes: 4
Antigüedad: 12 años, 3 meses
Puntos: 0
Respuesta: Sacar la media máxima de varias columnas

Jo!!! qué rápido, muchisimas gracias!!!

Había construido la tabla mejor pero al enviar la respuesta se ha movido todo, lo siento.

A ver si ahora sale mejor:

Alumno......|....NIF....|....NOTA1....|....NOTA2.. ..| (así hasta 10 notas)
María.........|...1234..|........5 ........|.......6.........|
Pepe.........|...1235...|........4 ........|........8........|

El campo NOTA corresponde a cada asignatura, en la cual cada alumno tiene una nota. Para el ejemplo María tiene un "5" en la "NOTA1" y un "6" en la "NOTA2".
NIF es el id y PK de esta tabla y no hay FK implicadas.

Tengo que sacar la media de cada NOTA para todos los alumnos lo cual me queda una consulta asi:

select AVG(NOTA1), AVG(NOTA2) from NOTAS;

Esto me devuelve una tabla con una sola tupla con 10 columnas (una por cada asignatura) correspondiente a las medias de cada una.

El problema viene ahora, cuando tengo que conseguir la máxima de todas esas columnas. Había imaginado que sería con una cláusula GROUP BY pero no doy con el criterio de agrupación correcto.

A ver si ahora me he explicado un poco mejor jejeje

Muchas gracias por vuestra atención y vuestro tiempo;
  #4 (permalink)  
Antiguo 21/01/2012, 09:57
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Sacar la media máxima de varias columnas

No estás posteando la estructura, como te pedí. Por favor, trata de ser más técnico en este rubro, porque es la forma de que ambos comprendamos las mismas cosas.
Cuando se te pide la estructura de la tabla, lo que se te pide es esto:
Código MySQL:
Ver original
  1. CREATE TABLE `notas` (
  2.   `alumno` int(11) NOT NULL auto_increment,
  3.   `nif` int(10) default NOT NULL,
  4.   `nota` int(10) default NULL,
  5.   `nota1` int(10) default NULL,
  6.   `nota2` int(10) default NULL,
  7.   PRIMARY KEY  (`nif`),
  8.   KEY `nif` (`nif`),
  9.   CONSTRAINT `nota_asignatura` FOREIGN KEY (`nota`) REFERENCES `asignatura` (`nota`)

Ahora bien, si lo que necesitas es la media de notas de cada asignatura, y esa materia debe ser identificable por nombre, obviamente necesitas trabajar con ambas tablas:
Código MySQL:
Ver original
  1. SELECT nombreMateria, AVG(nota1) nota1, AVG(nota2) nota2, AVG(nota3) nota3, ...
  2. FROM notas N INNER JOIN asignatura A ON N.nota = A.nota
  3. GROUP BY A.nota;

Pero si lo que quieres es la media de cada nota de cada alumno, se agrupa por alumno:
Código MySQL:
Ver original
  1. SELECT alumno, nif, nombreMateria, AVG(nota1) nota1, AVG(nota2) nota2, AVG(nota3) nota3, ...
  2. FROM notas N INNER JOIN asignatura A ON N.nota = A.nota
Lo que no puedes hacer es la media de las materias por materias y de los alumnos en cada pamteria alumnos al mismo tiempo porque las lógicas de las consultas son interexcluyentes.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #5 (permalink)  
Antiguo 21/01/2012, 10:31
 
Fecha de Ingreso: enero-2012
Mensajes: 4
Antigüedad: 12 años, 3 meses
Puntos: 0
Respuesta: Sacar la media máxima de varias columnas

Perdona que no te haya entendido... y gracias por tu tiempo.

La estructura de la tabla es esta
Código SQL:
Ver original
  1. CREATE TABLE NOTAS(
  2.  
  3. Nombre VARCHAR(20),
  4. NIF CHAR(10),
  5. NOTA_1int(2),
  6. NOTA_2 INT(2),
  7. NOTA_3 INT(2),
  8. NOTA_4 INT(2),
  9.  
  10. CONSTRAINT pk_NIF PRIMARY KEY (NIF))engine=innodb;

Es una sola tabla. Los campos NOTAS es como si fuerans la asignaturas,

La consulta que hago para sacar la media de cada "NOTA" es la siguiente:
Código MySQL:
Ver original
  1. select avg(NOTA_1) NOTA_1, avg(NOTA_2) NOTA_2, AVG(NOTA_3) NOTA_3 from NOTAS;


Código Apache:
Ver original
  1. +--------+--------+--------+
  2. | NOTA_1 | NOTA_2 | NOTA_3 |
  3. +--------+--------+--------+
  4. | 5.2593 | 5.2593 | 5.0741 |
  5. +--------+--------+--------+

Y ahora lo que necesito es sacar cual es la máxima de todas ellas.

Muchas gracias por todos gnzsoloyo.
  #6 (permalink)  
Antiguo 21/01/2012, 10:50
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Sacar la media máxima de varias columnas

Cita:
Y ahora lo que necesito es sacar cual es la máxima de todas ellas.
Eso sólo puedes hacerlo usando funciones sobre una subconsulta.
Código MySQL:
Ver original
  1. SELECT GREATEST(NOTA_1, NOTA_2, NOTA_3) MAXNOTA
  2. FROM (SELECT avg(NOTA_1) NOTA_1, avg(NOTA_2) NOTA_2, AVG(NOTA_3) NOTA_3 FROM NOTAS) T1
Lo que no puedes haces es determinar cuál es la columna a que pertenece la nota, por lo que no puedes devolver esa info. Y como no puedes usar una función PIVOT, porque no existe en MySQL, no puedes transformar un campo en un registro, y por tanto sólo te queda analizar la respuesta de la consulta anterior.

En realidad, a mi entender todo el esquema está mal diseñado, porque no se ajusta a modelos bien construidos para administrar las calificaciones de un sistema educativo. Pero eso es tu decisión.
Lo que si te puedo decir con certe4za es que el esquema que usas hará que tus consultas sean complicadas, ineficientes y difíciles de generalizar.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)

Última edición por gnzsoloyo; 21/01/2012 a las 12:02
  #7 (permalink)  
Antiguo 22/01/2012, 06:33
 
Fecha de Ingreso: enero-2012
Mensajes: 4
Antigüedad: 12 años, 3 meses
Puntos: 0
Respuesta: Sacar la media máxima de varias columnas

Mil gracias gnzsoloyo :
Me has resuelto todas las dudas que tenia!!! (al menos de momento porque seguro que vendrán más jejeje)

Ya me había dado cuenta de que el esquema no estaba muy bien diseñado... al hacer otras consultas que me costaron bastante. Pero es un esquema que me han dado y con el que tengo que trabajar. Al menos me quedo con la parte positiva, que es haber conocido este foro y comprobar que hay personas dispuestas a ayudar de forma desinteresada una vez más MIL GRACIAS.

Un Saludo!!!

Etiquetas: columnas, maximo
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 19:49.