Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

Clausula WHERE no exercicio final

Boa noite!

Eu realizei a solucao do ultimo exercicio da seguinte maneira:

SELECT C.NOME, TO_CHAR(NF.DATA_VENDA, 'YYYY-MM') AS MES_ANO, SUM(INF.QUANTIDADE) AS VOLUME_DE_COMPRA, C.VOLUME_DE_COMPRA AS VOLUME_LIMITE,
        CASE WHEN SUM(INF.QUANTIDADE) > C.VOLUME_DE_COMPRA THEN 'Compra Invalida'
        ELSE 'Compra Valida'
        END AS RESULTADO
FROM NOTAS_FISCAIS NF
INNER JOIN ITENS_NOTAS_FISCAIS INF ON NF.NUMERO = INF.NUMERO
INNER JOIN TABELA_DE_CLIENTES C ON NF.CPF = C.CPF
GROUP BY C.NOME, TO_CHAR(NF.DATA_VENDA, 'YYYY-MM'), C.VOLUME_DE_COMPRA
ORDER BY C.NOME, MES_ANO;

Entretanto, para fazer alguns testes, gostaria de filtrar o resultado para apenas registros cujo field RESULTADO fosse igual a 'Compra Invalida'. Tentei utilizar a clausula WHERE de todas as formas e ainda tentei utilizar o HAVING, mas mesmo assim nao consegui obter o resultado esperado.

Como eu consigo filtrar apenas os resultados cujo field RESULTADO = 'Compra Invalida' ?

Att. Lucas Delfino.

1 resposta
solução!

Boa dia Lucas, tudo bem?

Então, o problema maior é que a coluna resultado está sendo montada em tempo de execução pela sua consulta SQL.

Tem duas formas

1 O Having deve filtrar o que vc considera compra válida/inválida

HAVING SUM(INF.QUANTIDADE) > C.VOLUME_DE_COMPRA | HAVING SUM(INF.QUANTIDADE) < C.VOLUME_DE_COMPRA

2 (Essa eu prefiro) Usando CTE's 2.1 Vc isola a consulta e depois faz o filtro

;WITH cBase AS (
    SELECT C.NOME, TO_CHAR(NF.DATA_VENDA, 'YYYY-MM') AS MES_ANO, SUM(INF.QUANTIDADE) AS VOLUME_DE_COMPRA, C.VOLUME_DE_COMPRA AS  VOLUME_LIMITE,
        CASE WHEN SUM(INF.QUANTIDADE) > C.VOLUME_DE_COMPRA THEN 'Compra Invalida'
        ELSE 'Compra Valida'
        END AS RESULTADO
    FROM NOTAS_FISCAIS NF
    INNER JOIN ITENS_NOTAS_FISCAIS INF ON NF.NUMERO = INF.NUMERO
    INNER JOIN TABELA_DE_CLIENTES C ON NF.CPF = C.CPF
    GROUP BY C.NOME, TO_CHAR(NF.DATA_VENDA, 'YYYY-MM'), C.VOLUME_DE_COMPRA
    ORDER BY C.NOME, MES_ANO
)
SELECT * FROM cBase WHERE RESULTADO = 'Compra Valida'