1
resposta

Consulta SQLSeverII (Sub-queries)

Olá, estou cursando a parte de sub-queries do SQL Server II e gostaria de saber qual seria a melhor forma de consultar a média de cada aluno por curso, a média do curso e a diferença entre as médias. Meu código ficou assim:

USE SQL_AVANCADO;

SELECT A1.NOME, C1.NOME,

    (SELECT AVG(NC.NOTA) AS MEDIA_CURSO FROM NOTA NC
    INNER JOIN RESPOSTA R ON R.ID = NC.RESPOSTA_ID
    INNER JOIN EXERCICIO E ON E.ID = R.EXERCICIO_ID
    INNER JOIN SECAO S ON S.ID = E.SECAO_ID
    INNER JOIN CURSO C ON C.ID = S.CURSO_ID
    WHERE C.ID = C1.ID) MEDIA_CURSO,

    (SELECT AVG(NA.NOTA) AS MEDIA_ALUNO FROM NOTA NA
    INNER JOIN RESPOSTA R ON R.ID = NA.RESPOSTA_ID
    INNER JOIN EXERCICIO E ON E.ID = R.EXERCICIO_ID
    INNER JOIN SECAO S ON S.ID = E.SECAO_ID
    INNER JOIN CURSO C ON C.ID = S.CURSO_ID
    INNER JOIN ALUNO A ON A.ID = R.ALUNO_ID
    WHERE C.ID = C1.ID
    AND A.ID = A1.ID) MEDIA_ALUNO,

    ((SELECT AVG(NC.NOTA) AS MEDIA_CURSO FROM NOTA NC
    INNER JOIN RESPOSTA R ON R.ID = NC.RESPOSTA_ID
    INNER JOIN EXERCICIO E ON E.ID = R.EXERCICIO_ID
    INNER JOIN SECAO S ON S.ID = E.SECAO_ID
    INNER JOIN CURSO C ON C.ID = S.CURSO_ID
    WHERE C.ID = C1.ID) -

    (SELECT AVG(NA.NOTA) AS MEDIA_ALUNO FROM NOTA NA
    INNER JOIN RESPOSTA R ON R.ID = NA.RESPOSTA_ID
    INNER JOIN EXERCICIO E ON E.ID = R.EXERCICIO_ID
    INNER JOIN SECAO S ON S.ID = E.SECAO_ID
    INNER JOIN CURSO C ON C.ID = S.CURSO_ID
    INNER JOIN ALUNO A ON A.ID = R.ALUNO_ID
    WHERE A.ID = A1.ID
    AND C.ID = C1.ID)) AS DIFERENCA

    FROM NOTA N
    INNER JOIN RESPOSTA R ON R.ID = N.RESPOSTA_ID
    INNER JOIN EXERCICIO E ON E.ID = R.EXERCICIO_ID
    INNER JOIN SECAO S ON S.ID = E.SECAO_ID
    INNER JOIN CURSO C1 ON C1.ID = S.CURSO_ID
    INNER JOIN ALUNO A1 ON A1.ID = R.ALUNO_ID
    GROUP BY A1.NOME, C1.NOME, A1.ID, C1.ID
    ORDER BY A1.NOME, C1.NOME

Seria essa uma boa forma de consultar? Existe alguma forma mais adequada?

Desde já agradeço!

1 resposta

Opa Rubens, parece ótima a sua solução. Acredito que dê pra simplificar ali nos Inner Joins do final. Parece não precisar desses joins em RESPOSTA, EXERCICIO e SECAO já que você não usa eles para nada na query principal, só nas subqueries.