1
resposta

Qual o erro em minha query?

Fiz a seguinte query:

select year(DATA_VENDA), round( IMPOSTO * (QUANTIDADE * PRECO)) as imposto_pago
 from notas_fiscais NF inner join itens_notas_fiscais INF on NF.NUMERO = INF.NUMERO
 group by year(NF.DATA_VENDA) having year(NF.DATA_VENDA) = '2016';

Acusa o seguinte erro:

`Error Code: 1054. Unknown column 'NF.DATA_VENDA' in 'having clause' 0.000 sec


Tentei fazer assim:

select year(DATA_VENDA), round( IMPOSTO * (QUANTIDADE * PRECO)) as imposto_pago from notas_fiscais NF inner join itens_notas_fiscais INF on NF.NUMERO = INF.NUMERO group by DATA_VENDA having year(DATA_VENDA) = '2016'

`

Mas ele não aglutina as vendas e soma o imposto pago, apenas mostra as vendas do ano de 2016. Qual o erro?

1 resposta

Olá Pedro, tudo bem? O que acontece é que o HAVING só é executado após o agrupamento dos dados, você pode entender a ordem de execução nessa imagem: Ordem de execução

Agora sobre o erro, o que está acontecendo é o seguinte: Quando HAVING vai ser executado já aconteceu o GROUP BY, ou seja os dados já estão agrupados, e portanto não temos mais acesso a coluna DATA_VENDA, por isso quando você informa na função YEAR(DATA_VENDA) = '2016' é retornado esse erro dizendo que não foi possível encontrar o campo DATA_VENDA.

Nesse caso, você poderia criar um ALIAS para o campo YEAR(DATA_VENDA) e depois usá-lo no HAVING da seguinte forma:

SELECT YEAR(DATA_VENDA) AS ANO_VENDA, ROUND(IMPOSTO * (QUANTIDADE * PRECO)) as imposto_pago
from notas_fiscais NF inner join itens_notas_fiscais INF on NF.NUMERO = INF.NUMERO
GROUP BY YEAR(NF.DATA_VENDA) HAVING ANO_VENDA = '2016';

Assim vai funcionar corretamente.

Espero ter ajudado!