1
resposta

Fórmula da porcentagem

Isso pode ser bobeira, também não interfere diretamente no exercício nem no curso, porém, me deixou intrigado hahaha. Sem querer fiz a divisão de forma diferente da fórmula proposta, ficando da seguinte forma: ((1-(QUANTIDADE_VENDAS/LIMITE DE VENDAS)) * -100). O que me deu uma porcentagem um pouco diferente da fornecida. Fiz alguns cálculos como, por exemplo, temos um pedido de quantidade 25366 e um limite de 20000, pela fórmula proposta o percentual que passou era de 21% e nos cálculos o correto seria 26,83%. Segue meu código:


SELECT X.NOME, X.ANO_MES, X.QUANTIDADE_VENDAS, X.LIMITE,
CASE
    WHEN X.QUANTIDADE_VENDAS > X.LIMITE THEN 'INVÁLIDA'
    ELSE 'VÁLIDA'
END AS VALIDADE, ((1-(X.QUANTIDADE_VENDAS/X.LIMITE)) * -100) AS PERCENTUAL
FROM
(SELECT CLI.NOME,
 DATE_FORMAT(NF.DATA_VENDA, '%Y-%m') AS ANO_MES, 
SUM(INF.QUANTIDADE) AS QUANTIDADE_VENDAS,
CLI.VOLUME_DE_COMPRA AS LIMITE
FROM tabela_de_clientes CLI
INNER JOIN notas_fiscais NF ON NF.CPF = CLI.CPF
INNER JOIN itens_notas_fiscais INF ON NF.NUMERO = INF.NUMERO
GROUP BY CLI.NOME, DATE_FORMAT(NF.DATA_VENDA, '%Y-%m')) X
WHERE (X.QUANTIDADE_VENDAS > X.LIMITE);

A minha dúvida é, o resultado da fórmula deu errado ou fiquei doido? hahahaha

1 resposta

Olá, Juliano, tudo bem?

Desde já peço desculpas pela demora em obter retorno.

O resultado deu diferente do esperado, pois alguns cálculos e instruções estão equivocadas.

Ao analisar o seu código notei que o cálculo referente a categorização ‘inválida’, você coloca X.QUANTIDADE_VENDAS > X.LIMITE, quando, na verdade seria (X.QUANTIDADE_LIMITE - X.QUANTIDADE_VENDAS) <0. Essa fórmula representa a diferença entre a quantidade limite de vendas e a quantidade efetivamente vendida pelo cliente, se o cliente comprou mais do que o limite máximo, a fórmula resultaria em um número negativo, indicando que ele ultrapassou o limite de compra estabelecido.

Além disso, o cálculo da diferença entre o limite de venda máximo e o realizado está quase correto, pois ao invés de multiplicar por 100, você acaba multiplicando por - 100 o que acaba gerando números negativos. A fórmula ficará assim:

(1 - (X.QUANTIDADE_LIMITE/X.QUANTIDADE_VENDAS)) * 100

No segundo SELECT, você deve selecionar também o CPF correspondente da tabela ITENS_NOTAS_FISCAIS e fazer o FROMna tabela NOTAS_FISCAIS.

Notei que ao invés de trazer o máximo de volume em compras, você apenas traz o campo TC.VOLUME_DE_COMPRA, o correto seria usar a função max, onde ele trará o máximo valor. A expressão ficará assim:

MAX(TC.VOLUME_DE_COMPRA)

Por fim, você na cláusula WHERE colocaremos a fórmula diferença entre a quantidade limite de vendas e a quantidade efetivamente vendida (X.QUANTIDADE_LIMITE - X.QUANTIDADE_VENDAS) < 0.

Seu código corrigido ficará assim:


SELECT X.NOME, X.ANO_MES, X.QUANTIDADE_VENDAS, X.QUANTIDADE_LIMITE,
CASE
    WHEN (X.QUANTIDADE_LIMITE - X.QUANTIDADE_VENDAS) < 0 THEN 'INVÁLIDA'
    ELSE 'VÁLIDA'
END AS VALIDADE, (1 - (X.QUANTIDADE_LIMITE/X.QUANTIDADE_VENDAS)) * 100  AS PERCENTUAL
FROM
(SELECT  NF.CPF, CLI.NOME,
 DATE_FORMAT(NF.DATA_VENDA, '%Y-%m') AS ANO_MES, 
SUM(INF.QUANTIDADE) AS QUANTIDADE_VENDAS,
MAX(CLI.VOLUME_DE_COMPRA) AS QUANTIDADE_LIMITE
FROM NOTAS_FISCAIS NF
INNER JOIN itens_notas_fiscais INF ON NF.NUMERO = INF.NUMERO
INNER JOIN TABELA_DE_CLIENTES CLI ON NF.CPF = CLI.CPF
GROUP BY NF.CPF, CLI.NOME, DATE_FORMAT(NF.DATA_VENDA, '%Y-%m')) X
WHERE (X.QUANTIDADE_LIMITE - X.QUANTIDADE_VENDAS) < 0;

Juliano, espero ter ajudado.

Caso surja alguma dúvida, ficarei à disposição.

Abraços e até mais!

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓. Bons Estudos!