1
resposta

Resolução

Primeiro armazenei o seguinte código dentro de uma view:

SELECT date_format(A.DATA_VENDA, '%Y - %m') AS ANO_MES,
A.NUMERO, A.CPF, C.NOME,
SUM(B.QUANTIDADE) AS QUANTIDADE_VENDAS,
C.VOLUME_DE_COMPRA AS LIMITE,
C.VOLUME_DE_COMPRA - SUM(B.QUANTIDADE) AS DIFERENCA,
(1-(C.VOLUME_DE_COMPRA - SUM(B.QUANTIDADE))) *100 AS PERCENTUAL ,
CASE WHEN (C.VOLUME_DE_COMPRA - SUM(B.QUANTIDADE)) < 0 THEN 'INVÁLIDO'
ELSE 'VÁLIDO' END AS STATUS_VENDA
FROM notas_fiscais AS A
INNER JOIN itens_notas_fiscais AS B
ON A.NUMERO = B.NUMERO
INNER JOIN tabela_de_clientes AS C
WHERE A.CPF = C.CPF
GROUP BY date_format(A.DATA_VENDA, '%Y - %m'), A.CPF;;

Depois utilizei a view assim:

SELECT * FROM vw_filtro_vendas WHERE STATUS_VENDA = 'INVÁLIDO';

No entanto não consegui calcular o percentual corretamente. Podem me ajudar?

1 resposta

Oi, Victor! Tudo certo por aí?

Peço desculpas pela demora em retornar.

Para calcular corretamente o percentual, precisaremo seguir algumas etapas:

  1. Localizar a view vw_filtro_vendas;

  2. Clicar com o botão direito do mouse sobre ela e escolher a opção "Alter View";

  3. Remover A.NUMERO dos campos presentes no SELECT, pois ele não é necessário;

  4. Usar a função MAX para pegar o limite de compra (dessa forma, estaremos levando em consideração o valor máximo possível para o volume das compras):

    MAX(C.VOLUME_DE_COMPRA) AS LIMITE,
  5. Também utilizar a função MAX para o cálculo da diferença:

    MAX(C.VOLUME_DE_COMPRA) - SUM(B.QUANTIDADE) AS DIFERENCA
  6. Utilizar a seguinte expressão para o percentual:

    (1-(MAX(C.VOLUME_DE_COMPRA)/SUM(B.QUANTIDADE))) * 100 AS PERCENTUAL

    Observe que, além de usar a função MAX sobre C.VOLUME_DA_COMPRA, foi trocado o sinal de subtração por um de divisão, permitindo o cálculo do percentual (que depende de uma razão entre dois valores).

  7. No CASE, também usar a função MAX para C.VOLUME_DE_COMPRA:

    CASE WHEN (MAX(C.VOLUME_DE_COMPRA) - SUM(B.QUANTIDADE)) < 0 THEN 'INVÁLIDO'
    ELSE 'VÁLIDO' END AS STATUS_VENDA
  8. Mudar a cláusula WHERE por ON, uma vez que estamos realizando um INNER JOIN;

    INNER JOIN tabela_de_clientes AS C
    ON A.CPF = C.CPF

Depois de todos esses passos, teremos como resultado o seguinte SELECT para construção da view:

SELECT date_format(A.DATA_VENDA, '%Y - %m') AS ANO_MES,
A.CPF, C.NOME,
SUM(B.QUANTIDADE) AS QUANTIDADE_VENDAS,
MAX(C.VOLUME_DE_COMPRA) AS LIMITE,
(1-(MAX(C.VOLUME_DE_COMPRA)/SUM(B.QUANTIDADE))) * 100 AS PERCENTUAL,
CASE WHEN (MAX(C.VOLUME_DE_COMPRA) - SUM(B.QUANTIDADE)) < 0 THEN 'INVÁLIDO'
ELSE 'VÁLIDO' END AS STATUS_VENDA
FROM notas_fiscais AS A
INNER JOIN itens_notas_fiscais AS B
ON A.NUMERO = B.NUMERO
INNER JOIN tabela_de_clientes AS C
ON A.CPF = C.CPF
GROUP BY date_format(A.DATA_VENDA, '%Y - %m'), A.CPF

Feito isso, você já pode salvar as alterações feitas em vw_filtro_vendas e então executá-la novamente:

SELECT * FROM vw_filtro_vendas WHERE STATUS_VENDA = 'INVÁLIDO';

Pronto! Assim conseguiremos visualizar todas as vendas inválidas! Victor, espero ter ajudado! Fico à disposição em caso de dúvidas,

Um forte abraço.

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