Ver Mensaje Individual
  #6 (permalink)  
Antiguo 23/02/2013, 12:18
Avatar de gnzsoloyo
gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 17 años
Puntos: 2658
Respuesta: Como devolver registros sin valores

Cita:
me sigue obviando al alumno Sebastián que es el que no tiene calificaciones, pero pertenece al id_curso=1
No te lo está obviando. Es que tu estás poniendo tres condiciones obligatorias y ese alumno no cumple con dos de ellas, por tanto no pertenece al rango.
Básicamente te estás olvidando del funcionamiento del AND.

Para que devuelva lo que quieres se deben cumplir estas condiciones:
1) Pertenecer al curso Nº 1 y no tener notas.
2) Pertenecer al curso, tener notas, estar en el ramo Nº 1 y además ser notas del semestre Nº 1.
Es decir, hay dos juegos de condiciones diferentes, que tienen en común un sólo parámetro.
Ahora bien, como ese parámetro puede no darse en la tabla de notas cuando el alumno no tiene, entones debe evaluarse sólo para la primera tabla, mientrs que en el segundo caso hay que evaluar la segunda tabla.
El resto de los parámetros deben ser nulos, o bien tener 1 en ambos valores.

La consulta sería:
Código MySQL:
Ver original
  1.     CONCAT(A.apellido, ' ', A.nombre) ALUMNO,
  2.     IFNULL(SUM(IF(id_parcial=1, nota, 0)), 0) nota1,
  3.     IFNULL(SUM(IF(id_parcial=2, nota, 0)), 0) nota2,
  4.     IFNULL(SUM(IF(id_parcial=3, nota, 0)), 0) nota3,
  5.     IFNULL(ROUND((sum(nota*(1-ABS(SIGN(id_parcial-1)))) + sum(nota*(1-ABS(SIGN(id_parcial-2)))) + sum(nota*(1-ABS(SIGN(id_parcial-3)))))/COUNT(nota),1), 0) PROMEDIO
  6.     i_alumnos A LEFT JOIN t_notas N ON A.id_alumno = N.id_alumno
  7.         (A.id_curso=1
  8.     AND N.id_curso IS NULL)
  9.         OR
  10.         (N.id_curso = 1
  11.     AND N.id_ramo   = 1
  12.     AND N.semestre  = 1)
  13. GROUP BY A.apellido
  14. ORDER BY A.apellido asc

Trata de analizar claramente los grupos de condiciones que debe cumplir cada caso.

Prueba:
Código MySQL:
Ver original
  1. mysql> SELECT
  2.     ->     CONCAT(A.apellido, ' ', A.nombre) ALUMNO,
  3.     ->     IFNULL(SUM(IF(id_parcial=1, nota, 0)), 0) nota1,
  4.     ->     IFNULL(SUM(IF(id_parcial=2, nota, 0)), 0) nota2,
  5.     ->     IFNULL(SUM(IF(id_parcial=3, nota, 0)), 0) nota3,
  6.     ->     IFNULL(ROUND((sum(nota*(1-ABS(SIGN(id_parcial-1)))) + sum(nota*(1-ABS(SIGN(id_parcial-2)))) + sum(nota*(1-ABS(SIGN(id_parcial-3)))))/COUNT(nota),1), 0) PROMEDIO
  7.     -> FROM
  8.     ->     i_alumnos A LEFT JOIN t_notas N ON A.id_alumno = N.id_alumno
  9.     -> WHERE
  10.     ->         (A.id_curso=1
  11.     ->     AND N.id_curso IS NULL)
  12.     ->         OR
  13.     ->         (N.id_curso = 1
  14.     ->     AND N.id_ramo   = 1
  15.     ->     AND N.semestre  = 1)
  16.     -> GROUP BY A.apellido
  17.     -> ORDER BY A.apellido asc;
  18. +-----------------------------------+-------+-------+-------+----------+
  19. | ALUMNO                            | nota1 | nota2 | nota3 | PROMEDIO |
  20. +-----------------------------------+-------+-------+-------+----------+
  21. | Castro Galarce Raquel             |   5.8 |   3.8 |   3.0 |      4.2 |
  22. | Contreras Castro Sebastißn AndrÚs |   0.0 |   0.0 |   0.0 |      0.0 |
  23. | Morgado Cifuentes Eduardo Alfredo |   7.0 |   7.0 |   6.0 |      6.7 |
  24. +-----------------------------------+-------+-------+-------+----------+
  25. 3 rows in set (0.00 sec)
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)