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