Code icon

MySQL - GROUP BY

Links


    //GROUP BY

    SELECT 'DATOS PUESTOS POR MI' "COLUMNA AÑADIDA", A.idAlumno, N.Nota FROM Alumno A
    INNER JOIN Nota N ON  A.idAlumno = N.idAlumno
    WHERE N.nota > 8;
    
    //--D0-EJEMPLOS BASICOS
    SELECT idgrupo, count(*) AS 'ALUMNOS' FROM Alumno GROUP BY idGrupo
    ORDER BY idGrupo;
    
    SELECT idgrupo, count(*) AS 'ALUMNOS' FROM Alumno A
    INNER JOIN Nota N ON N.idAlumno = A.idAlumno
    GROUP BY idGrupo
    ORDER BY idGrupo;
    
    //--HAVING: Filtro para los grupos, después del group BY
    SELECT idgrupo, AVG(N.nota*1.0)  AS 'ALUMNOS' FROM Alumno A
    INNER JOIN Nota N ON N.idAlumno = A.idAlumno
    WHERE A.idGrupo LIKE '%A'
    GROUP BY idGrupo
    HAVING AVG(N.Nota*1.0) < 5
    ORDER BY idGrupo;
    
    //--D1-Relación de notas medias de los alumnos del grupo 913NMB - 28 filas 2 con nota media, el resto con media valor NULL
    SELECT A.idAlumno,AVG(cast(N.Nota AS FLOAT)) FROM GRUPO G 
    INNER JOIN Alumno A ON G.idGrupo = A.idGrupo
    LEFT JOIN Nota N ON A.idAlumno = N.idAlumno
    WHERE G.idGrupo = '913NMB'
    GROUP BY A.idAlumno;
    
    //--D2-Número de asignaturas que imparte cada profesor del centro. Los que no tengan debe salir 0.  113 filas
    SELECT P.idProfesor, P.Nombre, COUNT(ASG.idAsignatura) AS 'Numero Asignaturas' FROM Profesor P
    LEFT JOIN AsignaturasGrupo ASG ON P.idProfesor = ASG.idProfesor
    GROUP BY P.idProfesor, P.Nombre
    ORDER BY [Numero Asignaturas];
    
    //--D3-Nota media de los alumnos de cada municipio. 40 filas
    SELECT A.Municipio, AVG(cast(Nota*1.0 AS FLOAT)) FROM ALUMNO A
    INNER JOIN Nota N On A.idAlumno = N.idAlumno
    GROUP BY A.Municipio
    ORDER BY A.Municipio;
    
    //--D4-Nota media de las notas puestas a los alumnos por cada profesor. 81filas, 113 si se quieren incluir todos aunque no pusieran notas.
    SELECT P.idProfesor, cast(AVG(N.Nota*1.0) AS DECIMAL(5,2)) FROM NOTA N
    INNER JOIN AsignaturasGrupo ASG ON N.idAsignatura = ASG.idAsignatura
    RIGHT JOIN Profesor P ON ASG.idProfesor = P.idProfesor
    GROUP BY P.idProfesor;
    
    //--D5-Relación de alumnos de El SAUZAL cuya nota media este entre 2 y 6. 111 filas
    SELECT A.idAlumno AS id, A.Nombre+Apellidos AS Alumno, CAST(AVG(N.Nota*1.0) AS DECIMAL (5,2)) AS 'Nota media' FROM Alumno A
    INNER JOIN Nota N ON A.idAlumno = N.idAlumno
    WHERE A.Municipio LIKE '%SAUZAL'
    GROUP BY A.idAlumno, A.Nombre+Apellidos
    HAVING CAST(AVG(N.Nota*1.0) AS DECIMAL (5,2)) BETWEEN 2 AND 6
    ORDER BY [Nota media];
    
    //--D6-Relación de nota media por profesor y asignatura  214 filas
    SELECT P.nombre, ASG.idProfesor, N.idAsignatura, AVG(N.Nota*1.0) AS 'Nota' 
    FROM Profesor P
    INNER JOIN AsignaturasGrupo ASG ON ASG.idProfesor = P.idProfesor
    INNER JOIN Alumno A ON A.idGrupo = ASG.idGrupo
    INNER JOIN NOTA N ON A.idAlumno = N.idAlumno AND N.idAsignatura = ASG.idAsignatura
    GROUP BY P.Nombre, ASG.idProfesor, N.idAsignatura;
    
    
    //--D7-Relación de nota media por asignatura.  279 filas
    SELECT ASG.idAsignatura, CAST(AVG(N.Nota*1.0) AS DECIMAL (5,2))
    FROM NOTA N
    INNER JOIN Asignatura ASG
    ON N.idAsignatura = ASG.idAsignatura
    GROUP BY ASG.idAsignatura
    
    
    //--D8-Relación de nota media por asignatura del grupo 913NMA. 14 filas  
    SELECT ASG.idAsignatura, ASG.Denominacion, CAST(AVG(N.Nota*1.0) AS DECIMAL (5,2))
    FROM NOTA N
    INNER JOIN Asignatura ASG ON N.idAsignatura = ASG.idAsignatura
    INNER JOIN Alumno A ON N.idAlumno = A.idAlumno
    WHERE A.idGrupo = '913NMA'
    GROUP BY ASG.idAsignatura, ASG.Denominacion;
    
    
    //--D9-Relación alumnos con sus notas medias que son de TACORONTE y tienen de nota media entre un 5 y un 9.  298 FILAS (NO ES 289, FALLO EN APUNTES)
    SELECT A.idAlumno, AVG(N.Nota*1.0) FROM ALUMNO A
    INNER JOIN Nota N ON A.idAlumno = N.idAlumno
    WHERE A.Municipio LIKE '%TACORONTE'
    GROUP BY A.idAlumno
    HAVING AVG(N.Nota*1.0) BETWEEN 5 AND 9;
    
    //--RECHECK
    //--D10-Relación del número de bajas de cada grupo. Incluir en la relación también los grupos que tienen CERO bajas. 52 Filas
    //--importante no usar *  porque te cuenta las filas como 1, creo
    SELECT G.idGrupo, COUNT(B.Grupo) AS 'Numero de Bajas' FROM  Grupo G
    LEFT JOIN  Bajas B ON B.Grupo = G.idGrupo 
    GROUP BY G.idGrupo;
    
    
    
    
    //--CAST(AVG(N.Nota*1.0) AS DECIMAL (5,2)) 
    //--CAST(AVG(N.Nota) AS FLOAT)