2
respostas

Por que é retornado erro (ORA - 00979) se eu trocar o group by e.pergunta por group by e.id ?

Exercício: Traga todas os exercícios e a quantidade de respostas de cada uma. Mas dessa vez, somente dos cursos com ID 1 e 3.

select e.pergunta, count(r.id) as quantidade from exercicio e join resposta r on e.id = r.exercicio_id join secao s on s.id = e.secao_id join curso c on s.curso_id = c.id where c.id in (1,3) group by e.pergunta;

Dúvida: Por que é retornado erro (ORA - 00979) se eu trocar o group by e.pergunta por group by e.id ?

2 respostas

Vinicius, para que a query SQL traga o resultado do agrupamento (no caso quantidade de respostas por pergunta), o banco de dados precisa da informação para realizar o cálculo da função analítica (no caso count). A opção seria trazer o ID e a PERGUNTA e agrupar por ambas colunas, assim:

select e.id, e.pergunta, count(r.id) as quantidade from exercicio e join resposta r on e.id = r.exercicio_id join secao s on s.id = e.secao_id join curso c on s.curso_id = c.id where c.id in (1,3) group by e.id, e.pergunta;

A dica que deixo aqui é: para evitar erros em agrupamentos, traga as colunas não calculadas antes e depois as funções analíticas (count, max, min, etc) e no group by basta copiar as colunas não calculadas. Por exemplo:

select A, B, C, count(D), max(E), min (F) from tabelas group by A, B, C;

Outra dica, se você está transformando a informação, também pode usar no agrupamento. Por exemplo, quantas pessoas nasceram em certa data.

select to_char(DATA_NASCIMENTO,'DD/MM/YYYY'), count(ID_PESSOA) from tabela PESSOAS where DATA_NASICENTO = '01/01/2019' group by DATA_NASCIMENTO

Ou seja, apesar de haver uma transformação de Date para Varchar no SELECT, no agrupamento pode-se usar diretamente a coluna Date, em vez de usar a transformada (TO_CHAR).