1
resposta

Diferença entre WHERE e HAVING para Views

Olá, resolvi o exercício proposto criando uma View para as consultas apresentadas pelo Instrutor e, em seguida, busquei fazer uma nova consulta na view, criando o novo campo de porcentagem e também específicando que eu só queria casos em que o status da compra era inválido. O código ficou da seguinte forma:

CREATE VIEW VW_STATUS_VENDA AS (SELECT X.CPF, X.NOME, X.MES_ANO, X.QUANTIDADE_VENDAS, X.QUANTIDADE_LIMITE,
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);

Select *, CONCAT(ROUND((QUANTIDADE_VENDAS/QUANTIDADE_LIMITE)*100,2),'%') AS PERCENTUAL FROM VW_STATUS_VENDA
HAVING STATUS_VENDA = 'INVÁLIDA';

Acontece que eu percebi que se eu trocasse a função HAVING pela WHERE, o resultado informado não seria igual. O código rodaria, porém a tabela resultante viria vazia. Lembro que ao aprender sobre WHERE e HAVING, o instrutor explicou que o HAVING seria usado no final da sentença, para filtrar a partir de resultados de funções anteriores (nesse caso a função CASE), enquanto o WHERE seria a partir de colunas pré definidas. Porém, como a View já estava criada e ja continha nela a coluna STATUS_VENDA, pensei que seria possível usar o WHERE neste caso. Gostaria de saber porque não podemos usar WHERE dessa forma, e o que deveria ser feito para funcionar tanto o WHERE, quanto o HAVING para esse exercício específico?

*Detalhe: Consegui usar o WHERE chamando a função CASE novamente na hora da definição. Porém queria saber como usar o WHERE sobre o nome já pré definido de uma coluna originada de uma função, se fosse possível

1 resposta

Olá, Lucas, tudo bem?

Desde já peço desculpas pela demora em obter retorno.

Lucas, testei sua VIEW trocando o HAVING pelo WHERE e rodou sem erro algum, como mostro no gif abaixo:

gif demonstrando um script sql no workbench. Há uma view, e um select nessa view, ao executar o código a view é criada e é gerada uma tabela da consulta

O erro que pode ter gerado anteriormente, pode estar relacionado há outros problemas que não seja consulta. Em relação a usar o WHERE sobre consulta pré-definida como uma view, como demonstrei na sua consulta, conseguimos usar o WHERE normalmente.

Outro exemplo de consulta utilizando o WHERE na sua VIEW seria:

SELECT *
FROM VW_STATUS_VENDA
WHERE CPF = '3623344710';

Espero ter ajudado.

Caso surja alguma dúvida, fico à disposição.

Grande abraço e até mais!

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓. Bons Estudos!