Olá, Leonardo, tudo bem?
Desculpe a demora em obter retorno.
O objetivo da consulta utilizada no vídeo da aula é trazer um ranking de vendas(unidades) por sabores do ano de 2016. No entanto, notei que na consulta ao fazer a soma das dessa quantidade, você faz a multiplicação pelo preço, ou seja, você está calculando a soma total do valor das vendas dos produtos no ano de 2016. Portanto, tenho alguns pontos de melhoria.
Na seleção 100%, que queria a quantidade por sabor vendida em 2016, você deve utilizar o sum()
apenas no campo quantidade. Ele trará o somatório de todas as quantidades dos produtos. Além disso, o SUM()
é uma função que agregação, portanto ela deve vir, acompanhada de um GROUP BY
, o sum irá agregar valores de várias linhas em uma única linha, mas precisa de informações adicionais para saber qual é o grupo de linhas que deve agregar. Devemos trazer no select
também o sabor, pois essa também é uma informação relevante, pois nessa primeira consulta estamos em busca da quantidade vendida por sabor ano 2016, por isso agruparemos pelo sabor e o ano.
O código ficará assim:
SELECT TP.SABOR, YEAR(NF.DATA_VENDA) AS ANO, SUM(INF.QUANTIDADE) AS QUANTIDADE FROM
TABELA_DE_PRODUTOS TP
INNER JOIN ITENS_NOTAS_FISCAIS INF ON TP.CODIGO_DO_PRODUTO = INF.CODIGO_DO_PRODUTO
INNER JOIN NOTAS_FISCAIS NF ON NF.NUMERO = INF.NUMERO
WHERE YEAR(NF.DATA_VENDA) = 2016
GROUP BY TP.SABOR, YEAR(NF.DATA_VENDA);
Portanto, reforço não haver necessidade de multiplicar a quantidade pelo preço.
A nossa segunda consulta como estamos em busca da quantidade total, não há a necessidade de trazer o sabor no select
, pois o objetivo é apenas gerar uma linha com a soma total. Portanto, o select
deverá ter apenas o ano e a soma da quantidade, e devemos agrupar o resultado apenas pelo ano.
A alteração do seu código ficará assim:
select extract(YEAR from NF.data_venda), sum(quantidade)
from tabela_de_produtos TP
inner join itens_notas_fiscais INF
on TP.codigo_do_produto = INF.codigo_do_produto
inner join notas_fiscais NF
on INF.numero = NF.numero
where year(data_venda) = 2016
group by extract(YEAR from NF.data_venda);
Em seguida você deverá fazer o inner join
ordenando pela quantidade da venda pelo sabor.
O código completo ficará assim:
SELECT VENDA_SABOR.SABOR, VENDA_SABOR.ANO, VENDA_SABOR.QUANTIDADE,
ROUND((VENDA_SABOR.QUANTIDADE/VENDA_TOTAL.QUANTIDADE) * 100, 2) AS PARTICIPACAO FROM
(SELECT TP.SABOR, YEAR(NF.DATA_VENDA) AS ANO, SUM(INF.QUANTIDADE) AS QUANTIDADE FROM
TABELA_DE_PRODUTOS TP
INNER JOIN ITENS_NOTAS_FISCAIS INF ON TP.CODIGO_DO_PRODUTO = INF.CODIGO_DO_PRODUTO
INNER JOIN NOTAS_FISCAIS NF ON NF.NUMERO = INF.NUMERO
WHERE YEAR(NF.DATA_VENDA) = 2016
GROUP BY TP.SABOR, YEAR(NF.DATA_VENDA)) AS VENDA_SABOR
INNER JOIN
(SELECT YEAR(NF.DATA_VENDA) AS ANO, SUM(INF.QUANTIDADE) AS QUANTIDADE FROM
TABELA_DE_PRODUTOS TP
INNER JOIN ITENS_NOTAS_FISCAIS INF ON TP.CODIGO_DO_PRODUTO = INF.CODIGO_DO_PRODUTO
INNER JOIN NOTAS_FISCAIS NF ON NF.NUMERO = INF.NUMERO
WHERE YEAR(NF.DATA_VENDA) = 2016
GROUP BY YEAR(NF.DATA_VENDA)) AS VENDA_TOTAL
ON VENDA_SABOR.ANO = VENDA_TOTAL.ANO
ORDER BY VENDA_SABOR.QUANTIDADE DESC;
Espero ter ajudado.
Caso surja alguma dúvida, fico à disposição.
Abraços e até mais!
Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓. Bons Estudos!