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

Dúvida no exercício GROUP BY com WHERE

O exercício pede: Devolva o curso e as médias de notas, levando em conta somente alunos que tenham "Silva" ou "Santos" no sobrenome. Cole a sua SQL aqui.

Eu respondi assim:

select c.nome, avg(n.nota) as media from nota n
join resposta r on r.id = n.resposta_id
join exercicio e on e.id = r.exercicio_id
join secao s on s.id = e.secao_id
join curso c on c.id = s.curso_id
join matricula m on m.curso_id = c.id
join aluno a on a.id = m.aluno_id
where a.nome like '%Silva%'
or a.nome like '%Santos%'
group by c.nome;

A resposta oficial é a seguinte:

select c.nome, avg(n.nota) from 
nota n
join resposta r on r.id = n.resposta_id
join exercicio e on e.id = r.exercicio_id
join secao s on s.id = e.secao_id
join curso c on c.id = s.curso_id
join aluno a on a.id = r.aluno_id
where a.nome like '%Santos%' or a.nome like '%Silva%'
group by c.nome

Qual a diferença entre um e outro e qual a mais correta?

6 respostas

Acho que vc só colocou a mais o join da matricula, não sei bem pq... De resto, ta bem ok :). Ah, inclusive foi legal vc usar o alias para a media.

Então Alberto, o problema é que os resultados das duas queries vieram diferentes.

O join da matricula deve ta influenciando então. Em geral a query mais correta é que usa apenas o que precisa.

solução!

join matricula m on m.curso_id = c.id

Essa linha força a trazer resultados apenas dos cursos onde existe matricula, por isso a diferença.

Agora entendi, obrigado Samir por esclarecer a minha dúvida!

Marca como solução então por favor ;)