SQL - consulta sql

 
Vista:

consulta sql

Publicado por beñat (3 intervenciones) el 05/11/2013 14:00:13
hola buena, necesito ayuda pa realizar una sencilla consulta sql, la consulta es:
Quiero lograr la nota mas baja de cada clase, os pongo un ejemplo:
nombre nota clase
juan 4 1
jose 5 1
juana 6 2
mikel 3 2
pepe 7 3
por ejemplo, en este ejemplo el resultado deberia ser juan, mikel y pepe, porque son los que tienen la nota mas baja de cada clase.
E probado a poner:
1
SELECT A.NOMBRE FROM PERSONAS WHERE A.NOTA<=ALL(SELECT NOTAS FROM PERSONAS) GROUP BY A.NOMBRE
o algo asi, pero no lo consigo, si alguien me puede ecgar una mano se lo agradeceria.

Un saludo y muchas gracias!!
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
sin imagen de perfil
Val: 806
Bronce
Ha mantenido su posición en SQL (en relación al último mes)
Gráfica de SQL

consulta sql

Publicado por leonardo_josue (1173 intervenciones) el 05/11/2013 17:19:12
Hola beñat:

Estás equivocando completamente la estrategia al utilizar ALL. Desde el momento en que hablas de obtener un MINIMO, debes hacer uso de la función de agrupación MIN en conjunto de la cláusula GROUP BY... si lo único que te interesa es conocer la calificación mínima para cada clase, basta que hagas esto:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
mysql> SELECT * FROM tabla;
+--------+------+-------+
| nombre | nota | clase |
+--------+------+-------+
| juan   |    4 |     1 |
| jose   |    5 |     1 |
| juana  |    6 |     2 |
| mikel  |    3 |     2 |
| pepe   |    7 |     3 |
+--------+------+-------+
5 rows in set (0.00 sec)
 
mysql> SELECT clase, MIN(nota) minima FROM tabla GROUP BY clase;
+-------+--------+
| clase | minima |
+-------+--------+
|     1 |      4 |
|     2 |      3 |
|     3 |      7 |
+-------+--------+
3 rows in set (0.00 sec)

Ahora bien, si quieres obtener el nombre del alumno que obtuvo la calificación más baja, entonces lo que haces es meter la consulta de arriba como una subconsulta y entonces FILTRAR la información, con un INNER JOIN:

1
2
3
4
5
6
7
8
9
10
11
12
mysql> SELECT T1.* FROM tabla T1
    -> INNER JOIN
    -> (SELECT clase, MIN(nota) minima FROM tabla GROUP BY clase) T2
    -> ON T1.clase = T2.clase AND T1.nota = T2.minima;
+--------+------+-------+
| nombre | nota | clase |
+--------+------+-------+
| juan   |    4 |     1 |
| mikel  |    3 |     2 |
| pepe   |    7 |     3 |
+--------+------+-------+
3 rows in set (0.00 sec)

Mucho ojo, estas consultas son de nivel básico, son de las primeras que debes aprender... y hay muchísimos ejemplos en internet. Para la próxima, pregunta primero a SAN GOOGLE, el seguramente tendrá la respuesta.

Saludos
Leo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar

consulta sql

Publicado por beñat (3 intervenciones) el 05/11/2013 17:47:22
gracias por su tiempo, la verdad que lo habia conseguido utilizando el operador IN, me di cuenta que lo estaba planteando mal, de todas formas gracias por su atencion
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

consulta sql

Publicado por Beñat (3 intervenciones) el 16/11/2013 15:06:53
Hola leonardo_jose:

Estas equivocado, ya que si que se puede realizar con la funcion all, del siguiente modo:

1
SELECT A.NOMBRE, A.NOTA FROM PERSONAS AS A GROUP BY A.NOMBRE, A.MOTA HAVING MIN(A.NOTA)<=ALL(SELECT MIN(NOTA) FROM PERSONAS WHERE A.CLASE=CLASE GROUP BY CLASE,NOMBRE)

de este modo comparas cada nota minima de cada clase con cada nota de la clase y obtiene la minima, no se si me explico, sino repasa la funcion HAVING Y ALL y lo veras clar, esta probado, funciona realmente!

Gracias!
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