Solucionado (ver solução)
Solucionado
(ver solução)
3
respostas

Consulta diferente

por que obtenho um resultado diferente usando essa query neste exercicio? segue a query:

select a.nome,avg(n.nota),
(select avg(n1.nota) from nota n1) media_geral,
AVG(n.nota) - (select avg(n2.nota) from nota n2) diferenca
from nota n
join resposta r on n.resposta_id = r.id
join exercicio e on r.exercicio_id = e.id
join secao s on e.secao_id = s.id
join curso c on s.curso_id = c.id
join matricula m on  m.curso_id = c.id
join aluno a on m.aluno_id = a.id
group by a.nome
3 respostas

Exemplifique melhor qual seria o resultado diferente, pois nem todos podem acessar à todos os cursos para saber exatamente do que você está falando. Qual o resultado que você espera?

Sinceramente, não sei de onde surgiu os valores da tua consulta, mas vou abrir teus olhos em relação a isto:

O exercício pede:

Exiba a média das notas por aluno, além de uma coluna com a diferença entre a média do aluno e a média geral. Use sub-queries para isso.

Então você pensa: como vou fazer isso? Primeira coisa que vem a mente é, tem nota que respondeu as questões. Assim, fazendo um select * from resposta eu sei pelos IDs os alunos que responderam as questões. Para que fique mais claro, faça select a.nome from aluno a join resposta r on r.aluno_id = a.id

Voltando ao que o exercício pede: média dos alunos e uma coluna da diferença de suas médias para a média geral. Eu sei que a tabela nota tem relação com a tabela resposta e esta tem relação com a tabela aluno, em nenhum momento a relação com a tabela matrícula é pedida, ainda mais por que eu não quero saber de alunos matriculados e sim da média de alunos.

Vou te mostrar a minha resposta pra este exercício, espero que te ajude, mas, pelo que entendi, o problema todo surgiu no momento em que você fez o vínculo com a tabela matrícula.

select a.nome as 'Aluno', avg(n.nota) as 'Média do aluno',
(avg(n.nota) - (select avg(nota.nota) from nota)) as 'Diferença da média geral',
(select avg(nota.nota) from nota) as 'Média Geral' from nota n 
join resposta r on n.resposta_id = r.id
join aluno a on r.aluno_id = a.id
group by a.nome
order by a.nome;
solução!

O problema é que vc está vinculando a tabela "Aluno" com a "Matricula" no Join, o que não tem relação com o exercício, já que há alunos sem matricula, o que compromete a integridade da média retornada pelo "AVG(...)"

Utilize: join aluno a on a.id = r.aluno_id

Apague: join matricula m on m.curso_id = c.id e join aluno a on m.aluno_id = a.id