Oi, Ricardo! Como vai?
Desde já, peço desculpas pela demora em retornar.
Parabéns pela resolução da atividade! Muito interessante saber que você buscou uma forma diferente para desenvolver a consulta — isso é muito importante para exploramos os nossos conhecimentos!
Sobre o seu script SQL, existem alguns pontos que gostaria de comentar, vamos nessa?
Neste cenário, para trabalharmos com o volume da compra, recomenda-se utilizar a função MAX
, uma vez que ela sempre retornará o valor máximo para este dado. Nesse sentido, em todos os lugares em que VOLUME_DE_COMPRA
aparece, o englobaremos pela função MAX
, como no trecho do SELECT
abaixo:
SELECT C.NOME, A.CPF, DATE_FORMAT(A.DATA_VENDA, "%Y-%c") AS ANO_MES,
SUM(B.QUANTIDADE) AS VOLUME_VENDIDO,
MAX(C.VOLUME_DE_COMPRA) AS VOLUME_DE_COMPRA
Ao utilizar SALDO_COMPRAS
, na realidade deveríamos calcular a diferença percentual entre VOLUME_DE_COMPRA
e QUANTIDADE
. Refazendo a expressão e alterando seu nome, chegamos no seguinte resultado:
ROUND((1-MAX(C.VOLUME_DE_COMPRA)/SUM(B.QUANTIDADE))*100,2) AS PERCENTUAL
Observe que, para calcular a diferença percentual, dividimos o valor máximo de C.VOLUME_DE_COMPRA
pela soma de B.QUANTIDADE
. Diminuímos o resultado obtido de 1 e, por fim, multiplicamos por 100, a fim de encontrar o valor em porcentagem.
Em nosso CASE
, o critério para saber se a compra foi ou não excedida é a diferença entre o volume da compra e a quantidade de fato vendida. Refatorando o seu código, chegamos neste CASE
:
CASE WHEN (MAX(C.VOLUME_DE_COMPRA)- SUM(B.QUANTIDADE)) < 0
THEN "VOLUME EXCEDIDO" ELSE "DENTRO DO LIMITE" END AS STATUS_VENDAS
Por fim, para encontrar somente as compras com o status "VOLUME EXCEDIDO", usaremos o código abaixo ao final da nossa consulta:
HAVING (MAX(C.VOLUME_DE_COMPRA) - SUM(B.QUANTIDADE)) < 0
Ele foi iniciado com a cláusula HAVING
, que filtra registros presentes em um SELECT
com GROUP BY
. O critério a ser levado em consideração é que o volume de compra subtraído de quantidade seja inferior a 0, categorizando a compra como "VOLUME EXCEDIDO".
Depois dessas alterações, chegamos neste SELECT
:
SELECT C.NOME, A.CPF, DATE_FORMAT(A.DATA_VENDA, "%Y-%c") AS ANO_MES,
SUM(B.QUANTIDADE) AS VOLUME_VENDIDO,
MAX(C.VOLUME_DE_COMPRA) AS VOLUME_DE_COMPRA,
ROUND((1-MAX(C.VOLUME_DE_COMPRA)/SUM(B.QUANTIDADE))*100,2) AS PERCENTUAL,
CASE WHEN (MAX(C.VOLUME_DE_COMPRA)- SUM(B.QUANTIDADE)) < 0
THEN "VOLUME EXCEDIDO" ELSE "DENTRO DO LIMITE" END AS STATUS_VENDAS
FROM notas_fiscais A
INNER JOIN itens_notas_fiscais B
ON A.NUMERO = B.NUMERO
INNER JOIN tabela_de_clientes C
ON A.CPF = C.CPF
GROUP BY A.CPF, DATE_FORMAT(A.DATA_VENDA, "%Y-%c")
HAVING (MAX(C.VOLUME_DE_COMPRA) - SUM(B.QUANTIDADE)) < 0;
Ricardo, continue sempre estudando e se dedicando! Fico à disposição para ajudá-lo em caso de dúvidas.
Abraços!
Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓. Bons Estudos!