Ver Mensaje Individual
  #5 (permalink)  
Antiguo 05/06/2012, 11:38
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, 2 meses
Puntos: 2658
Respuesta: GROUP BY Me los agrupa todos, no delimita

Cita:
La primera vista, aunque ya no me parece una opción, me gustaría que me explicaran por qué no agrupa por periodo, pues la trabajé mucho y no entiendo porqué me agrupa sin tener en cuenta el periodo.
Mira, uno de los problemas que tienes es que estás ordenando en una vista, cosa que no tiene mucho sentido a menos que uses la vista en "crudo", es decir, que la invoques como está y sn cambiar nada.
El ORDER BY y el GROUP BY son las cláusulas menos performánticas, y que sólo se deben usar donde y cuando se las necesite realmente.
Y no es en este punto.
¿Qué sentido tiene ordenar en una vista, para luego ordenar cuando llamas a la vista?

El segundo problema es que no conoces el funcionamiento del GROUP BY en MySQL, el cual tiene algunas diferencias bastante críticas.
Por empezar, cuando haces un agrupamiento simple sobre una tabla, es decir, sobre un sólo campo, tienes que tener en cuenta que MySQL simplificará el resultado y te devolverá el primer registro que encuentre con cada valor distinto sobre ese campo.
Este detalle implica que si tuvieses 30 valores de un campo, donde el mayor fuese el 7°, y el menor el primero, si agrupas directamente sobre otro campo, te devolverá el registro que primero encuentre: El del menor valor.
¿Se entiende?
Entonces, como el ORDER BY se aplica sobre el resultado de un GROUP BY (y no al revés), ese GROUP BY puede "esconder" valores antes del ordenamiento.
La única solución es:
1) La vista no debe ser ordenada.
2) Primer indicas el criterio de agrupamiento al invocar a la vista, incluyendo (como dice quimfv) todos los campos que actúan de datos base.
3) Ese SELECT debe generar una tabla derivada, a la cual se le aplica el ORDER BY.

En definitiva quedaría mas o menos así (ejemplo):
Código MySQL:
Ver original
  1. CREATE OR REPLACE VIEW vistanotascalculadas
  2.     `n`.`idAlumno`,
  3.     `a`.`NombresAlum`,
  4.     `mg`.`idMaterGrupo`,
  5.     `c`.`idCompet`,
  6.     `i`.`Indicador`,
  7.     `i`.`idIndic`,
  8.     `ga`.`idPeriodo`,
  9.     `g`.`idGrupo`,
  10.     `g`.`NombreGrupo`,
  11.     ((((`c`.`PorcCompet`* `i`.`PorcIndic`) / 100) * `n`.`Nota` )/100)  `NotaDeMateria`
  12.     tbnotas n INNER JOIN tbindicadores i ON `n`.`idIndic` = `i`.`idIndic`
  13.     INNER JOIN `tbcompetencias` `c` ON `i`.`CompetenciaIndic` = `c`.`idCompet`
  14.     INNER JOIN `tbmateriagrupo` `mg` ON `mg`.`idMaterGrupo` = `c`.`MateriaGrupoCompet` AND
  15.     INNER JOIN `tbalumnos` `a` ON `a`.`idAlum` = `n`.`idAlumno`
  16.     INNER JOIN `tbgrupoalumnos` `ga` ON `ga`.`idAlumno` = `a`.`idAlum`
  17.     INNER JOIN `tbgrupos` `g` ON `mg`.`idGrupo` = `g`.`idGrupo` AND `g`.`idGrupo` = `ga`.`idGrupo`;

Y luego la llamas:
Código MySQL:
Ver original
  1.     IDALUMNO,
  2.     NOMBRESALUM,
  3.     idGrupo,
  4.     IDMATERGRUPO,
  5.     PROMMATER
  6.     (SELECT
  7.         idAlumno,
  8.         NombresAlum,
  9.         idMaterGrupo,
  10.         idGrupo,
  11.         SUM(NotaDeMateria) PromMater
  12.     FROM `vistanotascalculadasper`
  13.     GROUP BY IDALUMNO, idMaterGrupo) T1
  14. ORDER BY idGrupo, idMaterGrupo;

Un detalle adicional: No tiene ningún sentido ni es buena performance crear una vista para cada sesión, persona, grupo, etc.
Es una pésima práctica que te puede llevar a perder el control de los objetos que hay en la base.
Lo que se hace es crear una vista con los datos necesarios para poder filtrarla y obtener el segmento de datos deseado.
¿Se comprende la idea?
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)