1
resposta

[Sugestão] MEU EXEMPLO DE SOLUÇÃO

No exemplo abaixo não utilizei o recurso de sub-consultas, utilizei somente 2 joins, espero ter agregado algo.

SELECT C.NOME, A.CPF, DATE_FORMAT(A.DATA_VENDA, "%Y-%c") AS ANO_MES, SUM(B.QUANTIDADE) AS VOLUME_VENDIDO,
C.VOLUME_DE_COMPRA, ROUND(((SUM(B.QUANTIDADE)/C.VOLUME_DE_COMPRA)-1)*100,2) AS SALDO_COMPRAS,
CASE WHEN ROUND(((SUM(B.QUANTIDADE)/C.VOLUME_DE_COMPRA)-1)*100,2) > 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");
1 resposta

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?

  1. 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
  2. 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.

  3. 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
  4. 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!