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

Dúvida referente a sintaxe, incorporando case when !

Olá, fiquei um bom tempo tentando entender o erro por trás do meu código e ainda não consegui identifica-lo. Apesar de ter resolvido o exercício sem problemas, tentei calcular a média do faturamento anual de todos os anos em um case when de ( acima, abaixo e na média) para classifica-los, mas falhei miseravelmente hahaahhah segue meu código abaixo!

select 
year(a.data_venda) as Período_Anual, 
round(sum(b.quantidade*b.preco),2) as faturamento, sum(b.quantidade*b.preco),
case
    when faturamento > avg(faturamento) then 'ACIMA da Média'
    when faturamento < avg(faturamento) then 'ABAIXO da Média'
    else ' MÉDIA'
end as informacao
from notas_fiscais as a 
inner join itens_notas_fiscais as b on a.numero = b.numero
group by year(a.data_venda),
order by year(a.data_venda);

O problema é que eu não faço ideia de como resolver isso, aplicar média após um resultado de query. Alguém poderia me dar um norte?

2 respostas

Após assistir a aula de sub-consultas:

/*incorporando um case when após resultado de query*/
select x.periodo_anual, x.faturamento,
case
    when x.faturamento > avg(x.faturamento) then 'ACIMA DA MÉDIA'
    when x.faturamento < avg(x.faturamento) then 'ABAIXO DA MÉDIA'
    else 'NA MÉDIA'
end as media 
from
(select 
year(a.data_venda) as periodo_anual, 
round(sum(b.quantidade*b.preco),2) as faturamento
from notas_fiscais as a 
inner join itens_notas_fiscais as b on a.numero = b.numero
group by year(a.data_venda)
order by year(a.data_venda)) as x
group by x.periodo_anual;

Mesmo assim, ainda não estou conseguindo tirar a média.

solução!

Olá Gustavo, tudo bem?

Achei muito legal você estar tentando praticar com outros exercícios o que você está aprendendo durante o curso, continue assim :).

Mas tenho algumas observações sobre a sua primeira query Gustavo, que pode ti ajudar no que você está querendo fazer:

  • Após utilizar o group by você informou uma vírgula, então automaticamente um erro de sintaxe será retornado.

  • Outro ponto é, no lugar de utilizar o Alias do cauculo do faturamento, tente utilizar diretamente a função, dessa forma:

select 
year(a.data_venda) as Período_Anual, 
round(sum(b.quantidade * b.preco),2) as faturamento, round(avg(b.quantidade*b.preco),2),
case
    when sum(b.quantidade*b.preco) > avg(b.quantidade*b.preco) then 'ACIMA da Média'
    when sum(b.quantidade*b.preco) < avg(b.quantidade*b.preco) then 'ABAIXO da Média'
    else ' MÉDIA'
end as informacao
from notas_fiscais as a 
inner join itens_notas_fiscais as b on a.numero = b.numero
group by year(a.data_venda)
order by year(a.data_venda);

Outro ponto Gustavo é que o resutado sempre será ACIMA DA MÉDIA, já que o fatuturamento é calculadoa partir da soma de quantidade * b.preco e a média é a divissão desse valor pela quantidade de registros existentes na tabela, ou seja,o faturamento do ano X será divido pela quantidade de registros existentes no banco de dados para aquele ano, então, o fatuamento sempre será maior que a sua média.

Espero ter ajudado, qualquer dúvida é só falar e bons estudos!