1
resposta

[Projeto] RESOLUÇÃO.

Opa, aqui está a minha forma de solução.

/* DIFERENÇA EM PORCENTAGEM*/
SELECT X.CPF, X.NOME, X.MES_ANO, X.QUANTIDADE_VENDAS, X.QUANTIDADE_LIMITE,
(X.QUANTIDADE_LIMITE - X.QUANTIDADE_VENDAS) < 0 as 'COMPRA INVÁLIDA',
ROUND(((1 - (X.QUANTIDADE_LIMITE/X.QUANTIDADE_VENDAS)) * 100), 2) AS 'DIFERENÇA EM PORCENTAGEM',
CASE 
    WHEN (X.QUANTIDADE_LIMITE - X.QUANTIDADE_VENDAS) < 0 THEN 'INVÁLIDA'
    ELSE 'VÁLIDA' 
END AS STATUS_VENDA
FROM (
SELECT NF.CPF, TC.NOME, DATE_FORMAT(NF.DATA_VENDA, '%Y-%m') AS MES_ANO, 
SUM(INF.QUANTIDADE) AS QUANTIDADE_VENDAS , 
MAX(TC.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 TC 
ON TC.CPF = NF.CPF
GROUP BY NF.CPF, TC.NOME, DATE_FORMAT(NF.DATA_VENDA, '%Y-%m')) X HAVING ((X.QUANTIDADE_LIMITE - X.QUANTIDADE_VENDAS) < 0) = 1;

Resultado:

IResultado da consulta

1 resposta

Oi, Douglas! Tudo certo por aí?

Mandou muito bem na resolução da atividade!

O único ponto de atenção é acerca das colunas COMPRA INVÁLIDA e STATUS_VENDA. Como ambas estão nos trazendo a mesma informação (diferença entre a quantidade limite e a de vendas), podemos remover uma das duas para eliminar a redundância de dados.

Dessa maneira, além de melhorarmos a visualização do resultado da busca, simplificamos a manipulação de dados e a manutenção do SELECT criado.

Abaixo, trago um exemplo de como ficaria o script SQL sem a coluna COMPRA INVÁLIDA:

/* DIFERENÇA EM PORCENTAGEM*/
SELECT X.CPF, X.NOME, X.MES_ANO, X.QUANTIDADE_VENDAS, X.QUANTIDADE_LIMITE,
ROUND(((1 - (X.QUANTIDADE_LIMITE/X.QUANTIDADE_VENDAS)) * 100), 2) AS 'DIFERENÇA EM PORCENTAGEM',
CASE 
    WHEN (X.QUANTIDADE_LIMITE - X.QUANTIDADE_VENDAS) < 0 THEN 'INVÁLIDA'
    ELSE 'VÁLIDA' 
END AS STATUS_VENDA
FROM (
SELECT NF.CPF, TC.NOME, DATE_FORMAT(NF.DATA_VENDA, '%Y-%m') AS MES_ANO, 
SUM(INF.QUANTIDADE) AS QUANTIDADE_VENDAS , 
MAX(TC.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 TC 
ON TC.CPF = NF.CPF
GROUP BY NF.CPF, TC.NOME, DATE_FORMAT(NF.DATA_VENDA, '%Y-%m')) X HAVING ((X.QUANTIDADE_LIMITE - X.QUANTIDADE_VENDAS) < 0) = 1;

Observe que a única diferença é que SELECT principal não possui mais o trecho abaixo:

(X.QUANTIDADE_LIMITE - X.QUANTIDADE_VENDAS) < 0 as 'COMPRA INVÁLIDA',

Douglas, espero que tenha gostado da dica! Continue focado nos estudos, caso surja alguma dúvida, conte com o fórum.

Até mais!