Solucionado (ver solução)
Solucionado
(ver solução)
3
respostas

Dúvida no exercício

Olá amigos ,

o exercício é o seguinte :

"Quais foram os clientes que fizeram mais de 2000 compras em 2016?" Depois de observar a resposta, eu fiquei um pouco na dúvida do * , mas acredito que seja utilizado para contar os registros. A resposta do professor :

SELECT CPF, COUNT(*) 
    FROM notas_fiscais
         WHERE YEAR(DATA_VENDA) = 2016
 GROUP BY CPF
 HAVING COUNT(*) > 2000

Certo, apesar da duvida, fez sentido parta mim , contudo havia elaborado uma outra resposta :

 SELECT * ,
         COUNT(CPF) AS CONTAGEM 
     FROM notas_fiscais 
GROUP BY CPF 
HAVING count(CPF)>2000 AND YEAR(DATA_VENDA) = 2016;

Não retornou resultado algum , fiquei na dúvida, o "AND YEAR(DATA_VENDA)=2016" que estaria zerando ? Será que é porque está inserido após ter sido unificados os valores ,assim não conseguindo classificar os do ano de 2016 ? O Having não aceitaria essa condição ? (Apesar que rodou, então não acredito que seja essa última) Ou qual seria a explicação ? Obrigado !

3 respostas
solução!

Lucas,

Realmente é uma boa pergunta... eu acredito que é somente o fato de você NÃO ter especificado no GROUP BY que queria também um tratamento especial do ANO da DATA_VENDA que foi colocado na cláusula HAVING. Em outras palavras, se você quiser usar desta forma precisa declarar suas escolhas na cláusula GROUP BY também.

Por favor, experimente assim:

SELECT * ,
       COUNT(CPF) AS CONTAGEM 
FROM notas_fiscais 
GROUP BY CPF, YEAR(DATA_VENDA)
HAVING count(CPF)>2000 AND YEAR(DATA_VENDA) = 2016;

Veja também:

==========================================================

Qual diferença entre where e having?

Ambos funcionam como se fossem um if, ou seja, filtram linhas do banco de dados.

O WHERE funciona direto na linha, já o HAVING funciona em resultados de agregadores de linhas, o mais usado é com o GROUP BY.

Pesquisando concluí que realmente é esperado que o seu uso sem um agregador funciona como um WHERE, não é uma coincidência, apesar de ser uma liberalidade, não há nada na especificação que diga que deva ser assim. De acordo com o Jefferson Almeida em comentário abaixo, fazer assim não é portável entre o padrão SQL.

Tem quem prefira até evitá-lo, usando subquery e outros mecanismos, aplicando o WHERE nesse resultado.

É realmente importante perguntar já que esse é um dos casos que funcionar pode não ser o certo, embora eu não consiga imagina que problema possa causar nesse caso. Já usar WHERE quando quer filtrar o agregado não funciona.

Maniero

https://pt.stackoverflow.com/questions/211794/qual-diferen%C3%A7a-entre-where-e-having#:~:text=Uma%20vez%20que%20cl%C3%A1usula%20Where%20realiza%20a%20filtragem,de%20interagir%20com%20elementos%20criados%20durante%20a%20consulta.

==========================================================

WHERE vs HAVING

https://stackoverflow.com/questions/2905292/where-vs-having

==========================================================

HAVING vs. WHERE in SQL: What You Should Know

Author's photo - Ignacio L. Bisso

https://learnsql.com/blog/sql-having-vs-where/

==========================================================

[]'s,

Fabio I.

Olá Fábio , muito obrigado por toda pesquisa e intenção de ajudar !! Deu certo !!!

Lucas, obrigado por me pontuar.