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 `n`.`idAlumno`,
`a`.`NombresAlum`,
`mg`.`idMaterGrupo`,
`c`.`idCompet`,
`i`.`Indicador`,
`i`.`idIndic`,
`ga`.`idPeriodo`,
`g`.`idGrupo`,
`g`.`NombreGrupo`,
((((`c`.`PorcCompet`* `i`.`PorcIndic`) / 100) * `n`.`Nota` )/100) `NotaDeMateria`
tbnotas n
INNER JOIN tbindicadores i
ON `n`.
`idIndic` = `i`.
`idIndic` INNER JOIN `tbcompetencias` `c` ON `i`.
`CompetenciaIndic` = `c`.
`idCompet` INNER JOIN `tbmateriagrupo` `mg` ON `mg`.
`idMaterGrupo` = `c`.
`MateriaGrupoCompet` AND INNER JOIN `tbalumnos` `a` ON `a`.
`idAlum` = `n`.
`idAlumno` INNER JOIN `tbgrupoalumnos` `ga` ON `ga`.
`idAlumno` = `a`.
`idAlum` INNER JOIN `tbgrupos` `g` ON `mg`.
`idGrupo` = `g`.
`idGrupo` AND `g`.
`idGrupo` = `ga`.
`idGrupo`;
Y luego la llamas:
Código MySQL:
Ver original IDALUMNO,
NOMBRESALUM,
idGrupo,
IDMATERGRUPO,
PROMMATER
idAlumno,
NombresAlum,
idMaterGrupo,
idGrupo,
SUM(NotaDeMateria
) PromMater
FROM `vistanotascalculadasper`
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?