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

Exercício Aula 05 - Listando Expressão Natural

Sobre a questão que foi proposta neste exercício, achei bastante complexa e desafiadora. Entretanto não consegui solucionar a questão.

Após ver a resposta, verifiquei que o mesmo não funciona.

Ele ocasiona um 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

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)
4 respostas

Olá Flavio!

Fiz o teste aqui com o esse código que você colocou e obtive o resultado esperado, como o exercício estava pedindo, olha essa foi o meu resultado. Temos que entender o que está causando esse erro na sua máquina! Pelo que o erro nos diz, aparentemente o problema está nessa função "YEAR(NF.DATA_VENDA)" dentro do SELECT, que como não está sendo usada por nenhuma função de agregação deve está está presente dentro do nosso GROUP BY como já está "YEAR(DATA_VENDA)". Porém o problema pode ser que o MySQL não consiga identificar que é o mesmo campo por causa da ausência do NF que é o alias da tabela, então tenta executar o SELECT dessa forma:

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(NF.DATA_VENDA) = 2016
GROUP BY TC.NOME, YEAR(NF.DATA_VENDA);

Se não conseguir o resultado esperado você pode tentar desabilitar o sql_mode=only_full_group_by, que é o que está causando esse erro, aqui na minha máquina quando executo o comando:

SELECT @@GLOBAL.sql_mode;

Ele retorna como resultado:

STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION

Então executa esse comando select e verifica o retorno se está aparecendo também o ONLY_FULL_GROUP_BY, se estive mostrando o ONLY_FULL_GROUP_BY você pode desabilitar o mesmo dentro do sql_mode com o seguinte comando:

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

E por fim executar novamente o:

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(NF.DATA_VENDA) = 2016
GROUP BY TC.NOME, YEAR(NF.DATA_VENDA);

Espero que tenha ajudado!

Utilizando o comando:

SELECT @@GLOBAL.sql_mode;

Tenho o retorno:

STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION

Quanto faço uso do comando:

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

Tenho 0 row(s) affected. E rodando o comando novamente, acontece o mesmo problema. O código não funciona.

solução!

Flavio, você reiniciou o MySQL Workbench ou o serviço do MySQL depois de aplicar o SET GLOBAL sql_mode, porque esse comando funciona apenas durante a seção e para tornar isso permanentemente temos que realizar a alteração dentro do arquivo de inicialização do MySQL. Você pode tentar fazer o seguinte:

Observação: Estou imaginando que esteja usando o Windows.

1 - Primeiro feche todas as conexões com o MySQL: Feche o Workbench, e depois pare o serviço do MySQL (Entre nos serviços do windows, busque pelo serviço com o nome de MySQL80 e com o botão direito do mouse clique na opção "parar");

2 - Vá até o diretório "C:\ProgramData\MySQL\MySQL Server 8.0" e abrir o arquivo my.ini (a pasta ProgramData é um diretório oculto do windows habilite a exibição de arquivos e pastas ocultas);

3 - Busque pela linha que comece com: sql-mode=;

4 - Alterar essa linha para:

sql-mode="STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION"

5 - Agora inicie o serviço do MySQL80, e depois o workbench e tenta novamente!

E responde aqui novamente se não conseguir o resultado esperado!

Funcionou. Obrigado!!!!

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