2
respostas

USO DO GROUP BY...

Criei a seguinte query...

SELECT a.cpf, b.nome as NOME_CLIENTE, a.matricula, c.nome AS NOME_VENDEDOR, 
a.data_venda, a.numero, (d.quantidade * d.preco) as TOTAL_NF, a.imposto 
FROM notas_fiscais a
inner join tabela_de_clientes b
on a.cpf = b.cpf
INNER JOIN tabela_de_vendedores C
ON a.matricula = c.matricula
INNER JOIN itens_notas_fiscais D
ON a.numero = d.numero
ORDER BY a.numero;

... que gerou uma tabela contendo para cada item da nota fiscal o valor total vendido. No entanto eu queria que esse valor total fosse somado, de modo que cada nota fiscal aparecesse apenas uma vez, agrupando por número da nota. Cheguei a seguinte query...

SELECT a.cpf, b.nome as NOME_CLIENTE, a.matricula, c.nome AS NOME_VENDEDOR, 
a.data_venda, a.numero, SUM(d.quantidade * d.preco) as TOTAL_NF, a.imposto 
FROM notas_fiscais a
inner join tabela_de_clientes b
on a.cpf = b.cpf
INNER JOIN tabela_de_vendedores C
ON a.matricula = c.matricula
INNER JOIN itens_notas_fiscais D
ON a.numero = d.numero
GROUP BY a.numero;

... que apresentou o seguinte erro...

ORA-00979: não é uma expressão GROUP BY
00979. 00000 -  "not a GROUP BY expression"
*Cause:    
*Action:
Erro na linha: 22 Coluna: 8

Não consegui entender onde está o erro. Por favor me orientem.

Obrigado.

2 respostas

Olá, Paulo, tudo bem?

Ao utilizarmos uma função de agregação, normalmente também precisamos informar a cláusula group by, que é utilizada para agrupar registros semelhantes de uma tabela em um ou mais campos.

No Oracle não é permitido realizar consultas onde os campos listados na seleção que não estão em uma função de agregação, não estão informados na cláusula group by, ou seja, para conseguir utilizar a cláusula group by, você precisaria informar todos os campos do select:

SELECT a.cpf, b.nome as NOME_CLIENTE, a.matricula, c.nome AS NOME_VENDEDOR, 
a.data_venda, a.numero, SUM(d.quantidade * d.preco) as TOTAL_NF, a.imposto 
FROM notas_fiscais a
inner join tabela_de_clientes b
on a.cpf = b.cpf
INNER JOIN tabela_de_vendedores C
ON a.matricula = c.matricula
INNER JOIN itens_notas_fiscais D
ON a.numero = d.numero
GROUP BY a.numero, a.cpf, b.nome, a.matricula, c.nome, 
a.data_venda,a.imposto ;

A título de curiosidade, caso queira ler um pouco mais a respeito deste assunto, indico a leitura do artigo Trabalhando com funções de agregação, publicado no blog da Alura.

Espero ter ajudado e bons estudos!

Olá Danielle

Obrigado por responder.

Na verdade eu compreendi meu erro na sequência das aulas, mas sua resposta vem confirmar minha conclusão.

Tenha a certeza que depois de tantas ligações cerebrais, nunca mais esquecerei desse detalhe.

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software