GUJ Discussões   :   últimos tópicos   |   categorias   |   GUJ Respostas

Contar e retornar o total de acertos


#1

Bom Dia!

Eu tenho um banco de dados chamado Prova com as seguintes tabelas prova e resp_aluno,

onde em prova eu tenho o gabarito ex.:
ID_Prova GABQ1 Gabq2 GABQ3
1585 A B C

e em resp_aluno eu tenho:
ID_Aluno ID_Prova RESPQ1 RESPQ2 RESPQ3
1234 1585 B B B

Estou com dificuldade em criar uma query que retorne a quantidade de erros e acertos dos alunos por prova e por questão

teria como fazer isso no SQL SERVER?

Alguém poderia me dar um Help?

Obrigada


#2

SELECT
(SELECT CONT() FROM RESP_ALUNO WHERE RESP_ALUNO.ID_PROVA=P.ID_PROVA AND RESP_ALUNO.RESPQ1=P.GABQ1 OR RESP_ALUNO.RESPQ2=P.GABQ2 OR RESP_ALUNO.RESPQ3=P.GABQ3) AS TOTAL_ACERTOS,
(SELECT CONT(
) FROM RESP_ALUNO WHERE RESP_ALUNO.ID_PROVA=P.ID_PROVA AND RESP_ALUNO.RESPQ1!=P.GABQ1AND RESP_ALUNO.RESPQ2!=P.GABQ2 AND RESP_ALUNO.RESPQ3!=P.GABQ3) AS TOTAL_ERROS
FROM PROVA P INNER JOIN RESP_ALUNO A ON P.ID_PROVA=A.ID_PROVA

Fiz no celular, talvez tenha algum erro de sintaxe


#3

Boa noite amiga

A resposta do amigo @Cleiton_Conceicao está muito boa, porém eu não gosto de usar subselect para formar campos pois quanto maior a tabela mais lenta a pesquisa, então fiz uma query para você escolher entre as duas.

SELECT
    ID_PROVA,
    ID_ALUNO,
    SUM(P1 + P2 + P3) ACERTOS,
    SUM((CASE WHEN P1  = 1 THEN 0 ELSE 1 END) 
      + (CASE WHEN P2  = 1 THEN 0 ELSE 1 END) 
      + (CASE WHEN P3  = 1 THEN 0 ELSE 1 END)) ERROS
FROM
(SELECT 
    PR.ID_PROVA,
    RP.ID_ALUNO,
    SUM(CASE WHEN PR.GABQ1 = RP.RESPQ1 THEN 1 ELSE 0 END) P1,
    SUM(CASE WHEN PR.GABQ2 = RP.RESPQ2 THEN 1 ELSE 0 END) P2,
    SUM(CASE WHEN PR.GABQ3 = RP.RESPQ3 THEN 1 ELSE 0 END) P3
 FROM 
    PROVA PR
    LEFT JOIN RESP_ALUNO RP ON PR.ID_PROVA = RP.ID_PROVA
 GROUP BY
    PR.ID_PROVA,
    RP.ID_ALUNO
) AS RESULTADO
GROUP BY
    ID_PROVA,
    ID_ALUNO 

Boa sorte :metal::sunglasses::metal: