1
resposta

Erro na resposta do professor ao exercício proposto

Testei o código na resposta do exercício:

SELECT CONCAT('O cliente ', TC.NOME, ' faturou ', 
CAST(SUM(INF.QUANTIDADE * INF.preco) AS char (20))
 , ' no ano ', CAST(YEAR(NF.DATA_VENDA) AS char (20))) AS SENTENCA FROM notas_fiscais NF
INNER JOIN itens_notas_fiscais INF ON NF.NUMERO = INF.NUMERO
INNER JOIN tabela_de_clientes TC ON NF.CPF = TC.CPF
WHERE YEAR(DATA_VENDA) = 2016
GROUP BY TC.NOME, YEAR(DATA_VENDA);

E está dando o seguinte erro:

Error Code: 1055. Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'sucos_vendas.NF.DATA_VENDA' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by

Alguém sabe dizer o que está acontecendo:

1 resposta

Oi, Aristides! Tudo certo por aí?

Peço desculpas pela demora em retornar.

O erro 1055 acontece porque o MySQL tem um modo de operação chamado "only_full_group_by", o qual determina que todas as colunas contidas no SELECT também estejam presentes na cláusula GROUP BY (que realiza o processo de agregação dos registros).

Para que esse erro não apareça nesta situação ou em outras semelhantes, podemos realizar o seguinte passo a passo:

1 - Executar o script abaixo em nosso MySQL Workbench:

SET GLOBAL sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));

De maneira geral, estamos alterando a organização do nosso ambiente global, substituindo o modo de operação only_full_group_by” (que está causando o erro) por uma string vazia, a qual na realidade não representa nada.

2 - Localizar, no menu de navegação, a opção “Database” e selecioná-la com o botão do mouse;

3 - Clicar em “Connect to Database” para inicializar o ambiente.

Para um melhor entendimento, observa a imagem abaixo que ilustra os passos 2 e 3:

Início da transcrição. Recorte de captura de tela do menu de opções superior do MySQL Workbench. Dentre os itens do menu, está selecionada a opção “Database”, ao seu lado há um círculo vermelho com o número “2” de coração branca. Da opção “Database”, é expandido uma lista de seleção cujo primeiro item, que diz “Connect to Database”, está destacado por um borda vermelha, no seu lado direito há um círculo vermelho com o número “3” de coloração branca. Fim da transcrição.

Feito isso, seu Banco de Dados será reconectado, basta você clicar no botão “Ok” para confirmar e então executar novamente o SELECT disponibilizado pelo exercício:

SELECT CONCAT('O cliente ', TC.NOME, ' faturou ', 
CAST(SUM(INF.QUANTIDADE * INF.preco) AS char (20))
 , ' no ano ', CAST(YEAR(NF.DATA_VENDA) AS char (20))) AS SENTENCA FROM notas_fiscais NF
INNER JOIN itens_notas_fiscais INF ON NF.NUMERO = INF.NUMERO
INNER JOIN tabela_de_clientes TC ON NF.CPF = TC.CPF
WHERE YEAR(DATA_VENDA) = 2016
GROUP BY TC.NOME, YEAR(DATA_VENDA);

Por meio dessas etapas, fazemos com que o modo "only_full_group_by" não seja mais levado em consideração pelo MySQL. Logo, o erro 1055 não aparecerá mais em nosso programa.

Aristides, espero ter ajudado! Caso o problema persista ou surjam outras dúvidas, fico à disposição.

Abraços.

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓.