1
resposta

Fiz um código SQL

Usei esse código e funcionou.

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
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;
1 resposta

Oi, Vitor! Tudo bem?

Desde já, peço desculpas pela demora em retornar.

Mandou bem na construção deste SELECT!

Para deixá-lo ainda mais completo, podemos adicionar uma nova coluna que classifica a venda como válida ou inválida. Para isso, iremos transformar a sua consulta em uma subconsulta, englobando-a por parênteses e adicionando um "apelido" para ela após o fechamento dos parênteses:

(
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
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
) X;

Observe que o apelido dado foi somente a letra "X" em maiúsculo!

Feito isso, iniciaremos um novo SELECT que irá utilizar os seguintes campos: CPF, ANO_MES, QUANTIDADE_VENDAS e LIMITE. Como ele irá buscar os dados da nossa subconsulta, precisamos passar a letra "X" antes de escrever cada campo, chegando no seguinte resultado:

SELECT X.CPF, X.NOME, X.ANO_MES, X.QUANTIDADE_VENDAS, X.LIMITE,
FROM (
    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
    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
) X;

Por fim, para definir quais vendas foram válidas ou inválidas, usaremos a estrutura CASE, a qual permite trabalhar com condições, dentro do primeiro SELECT:

CASE 
    WHEN (X.LIMITE - X.QUANTIDADE_VENDAS) < 0 THEN 'INVÁLIDA'
    ELSE 'VÁLIDA' 
END AS STATUS_VENDA

O CASE é composto por abertura e fechamento. Em sua abertura, utilizamos apenas a cláusula CASE, em seu fechamento, a cláusula END seguida de um AS e de um apelido para a nova coluna que será criada a partir de tal CASE (neste caso, a coluna chama-se STATUS_VENDA).

Dentro dele, foi utilizada a cláusula WHEN (que significa "quando" em português). Ela irá verificar se a subtração entre X.LIMITE e X.QUANTIDADE_VENDAS é menor que zero. Se isso for verdade, a cláusula THEN (em português, "então"), passará como valor do campo STATUS_VENDA a palavra "INVÁLIDA". Por fim, foi usado o ELSE, oferece uma solução caso a condição anterior não seja cumprida — neste cenário, caso a subtração não seja inferior a 0, então STATUS_VENDA terá o valor "VÁLIDA".

Depois dessas alterações, chegamos na seguinte consulta:

SELECT X.CPF, X.NOME, X.ANO_MES, X.QUANTIDADE_VENDAS, X.LIMITE,
CASE 
    WHEN (X.LIMITE - X.QUANTIDADE_VENDAS) < 0 THEN 'INVÁLIDA'
    ELSE 'VÁLIDA' 
END AS STATUS_VENDA
FROM (
    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
    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
) X;

Vitor, continue sempre estudando e evoluindo. Fico à disposição para ajudar em caso de dúvidas.

Abraços!

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