1
resposta

fazendo sozinho x fazendo com o professor

-- sozinho

-- selecao para descobrir o total (100%)

select sum(quantidade * preco) as SOMA 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;

-- selecao final

select TP.sabor, extract(YEAR from NF.data_venda), sum(quantidade * preco), (sum(quantidade * preco) / 42362119.43621111) * 100
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 TP.sabor, extract(YEAR from NF.data_venda)
order by sum(quantidade * preco) desc;

-- com a ajuda do professor

select SABOR.sabor,SABOR.dataa,SABOR.total_sabor_vendido, round((SABOR.total_sabor_vendido / TOTAL.total_vendido),2) * 100 as percentual from 
(select TP.sabor, extract(YEAR from NF.data_venda) as dataa, round(sum(quantidade * preco),2) as TOTAL_SABOR_VENDIDO 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 TP.sabor, extract(YEAR from NF.data_venda)) as SABOR
inner join 
(select sum(quantidade * preco) as TOTAL_VENDIDO 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) as TOTAL
order by percentual desc;
1 resposta

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!

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