Ver Mensaje Individual
  #1 (permalink)  
Antiguo 26/01/2012, 21:59
pablo_sgo2
 
Fecha de Ingreso: enero-2012
Mensajes: 9
Antigüedad: 12 años, 3 meses
Puntos: 0
Mensaje Group by & order by con una consulta (query) que incluye una union

Hola que tal compañeros escribo esta petición por si me pueden ayudar con una consulta que no puedo hacer funcionar al 100%....

Les comento la situación.

Tengo las siguientes tablas:

1.-Alumnos-------------> (matricula,id_plan)

2.-Historial Academico--> (matricula,id_plan,id_materia,calificaciones)

3.-Materias------------->(id_materia,id_plan,nombre_materia,cuatrimestre,o rden_cuatrimestre,id_cup)

4.-Plan de Estudios----->(id_plan)

La relacion pues cada campo que tienen el mismo nombre
(ojo de la tabla materia el id_cup no es un identificador solo es un dato de la materia, los importantes de la tabla materias son todos menos ese, ese dato solo lo uso para mostrarlo pero no lo uso como identidicador)..:)

Relaciones:

*Un alumno esta inscrito en un plan de estudios
*Un plan de estudios tiene unas materias ordenadas por cuatrimestre asu vez
*Las materias corresponden a un plan (que es lo mismo que la linea anterior pero inverso)
*El historial academico almacena las "calificaciones" por "matricula" (identificador del alumno). y únicamente las que tienen "calificaciones"

Bueno ahora, lo que tengo que realizar

Un query (consulta) que me muestre todas las materias por alumno las que
esten en la tabla de "historial academico" con calificaciones y las que esten en la tabla materias que corresponden a un mismo plan al que pertenece un alumno pero que aun no ha cursado(es decir que no tienen "calificacion")...

En pocas palabras mostrar las calificaciones que tengan calificacion y las que no
pero ordenadas por el cuatrimestre y orden cuatrimestre.

Tengo dos querys los cuales (uní)
y me trae esos registros pero marca errores al aplicar las sentencias de
GROUP BY nombre_materia
ORDER BY cuatrimestre

Este query me trae las que tienen evaluaciones (de la tabla historial academico)


Código:
SELECT c.id_cup,c.nombre_materia,b.calificaciones,c.id_materia 
FROM alumnos a,historial_academico b,materias c
WHERE a.matricula=b.matricula
AND a.id_plan=b.id_plan
AND b.id_plan=c.id_plan
AND b.id_materia=c.id_materia
AND a.matricula =300
AND c.orden_cuatrimestre=6
GROUP BY nombre_materia
ORDER BY cuatrimestre

Este otro las que no ha cursado (de la tabla materias)

Código:
SELECT id_cup,nombre_materia,'0',id_materia
                                    FROM materias 
                                    WHERE id_materia 
                                    NOT IN (SELECT id_materia 
                                    FROM historial_academico 
                                    WHERE matricula = 300) 
                                    AND id_plan=(SELECT a.id_plan 
                                    FROM plan_estudios AS a,alumnos AS b 
                                    WHERE a.id_plan = b.id_plan AND b.matricula = 300)
                                    AND orden_cuatrimestre=6
                                    GROUP BY nombre_materia
                                    ORDER BY cuatrimestre

Ahora si uso la sentencia UNION si me trae los registros pero no se donde aplicar
las sentencias

GROUP BY nombre_materia
ORDER BY cuatrimestre

Todo lo que me traiga(solo son 8 registros del primer query y 1 registro del segundo query)
Ya unidos pues 9 pero tengo que a agrupar y ordenar los 9 registros por esos campos
o atributos.

aqui les dejo el query en el que uno los dos.....

Código:
(SELECT c.id_cup,c.nombre_materia,b.calificaciones,c.id_materia 
FROM alumnos a,historial_academico b,materias c
WHERE a.matricula=b.matricula
AND a.id_plan=b.id_plan
AND b.id_plan=c.id_plan
AND b.id_materia=c.id_materia
AND a.matricula =300
AND c.orden_cuatrimestre=6
GROUP BY nombre_materia
ORDER BY cuatrimestre) UNION (SELECT id_cup,nombre_materia,'0',id_materia
                                    FROM materias 
                                    WHERE id_materia 
                                    NOT IN (SELECT id_materia 
                                    FROM historial_academico 
                                    WHERE matricula = 300) 
                                    AND id_plan=(SELECT a.id_plan 
                                    FROM plan_estudios AS a,alumnos AS b 
                                    WHERE a.id_plan = b.id_plan AND b.matricula = 300)
                                    AND orden_cuatrimestre=6
                                    GROUP BY nombre_materia
                                    ORDER BY cuatrimestre)
Saludos por favor si me pueden ayudar se los agradeceria mucho, gracias de antemano..