1
resposta

No exercicio a seguir eu usei o having na minha solução, já o professor usou o where no final. Tem alguma diferença ?

//Minha solução

SELECT x.nome, x.cpf, x.MES_ANO, x.QUANTIDADE_COMPRADA, x.VOLUME_MENSAL, 
CONCAT(FLOOR((1 - (X.volume_mensal/X.quantidade_comprada)) * 100), '%') AS PORCENTAGEM,
CASE 
    WHEN( x.VOLUME_MENSAL - x.QUANTIDADE_COMPRADA) < 0 THEN 'INVALIDA'
    ELSE 'VALIDA'
    END AS STATUS_VENDA
FROM (SELECT nome, tc.cpf, DATE_FORMAT(data_venda, '%M %Y') AS MES_ANO, 
    SUM(quantidade) AS QUANTIDADE_COMPRADA, MAX(volume_de_compra) AS VOLUME_MENSAL
FROM tabela_de_clientes tc,
     notas_fiscais nf,
     itens_notas_fiscais inf
WHERE tc.cpf = nf.cpf
AND   nf.numero = inf.numero
GROUP BY nome, DATE_FORMAT(data_venda, '%M %Y'))x 
HAVING STATUS_VENDA = 'INVALIDA';

//Professor

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, (1 - (X.QUANTIDADE_LIMITE/X.QUANTIDADE_VENDAS)) * 100 AS PERCENTUAL
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
WHERE (X.QUANTIDADE_LIMITE - X.QUANTIDADE_VENDAS) < 0;
1 resposta

Olá.

A do professor não faz o JOIN no WHERE. A SUA sim. Melhores práticas: JOIN no WHERE.

Agora, sobre o HAVING: usado para filtrar agregações. Simples.

Veja esse tópico no forum da Alura: https://cursos.alura.com.br/forum/topico-diferenca-entre-having-e-where-64816

Abraço,