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

Uso do CASE no Group By

Por que quando eu utilizo o código dessa maneira, me retorna apenas 3 resultados?

Print do resultado: https://ibb.co/t4j8c1n

O código é esse:

SELECT EMBALAGEM,
CASE 
   WHEN PRECO_DE_LISTA >= 12 THEN 'PRODUTO CARO'
   WHEN PRECO_DE_LISTA >= 7 AND PRECO_DE_LISTA < 12 THEN 'PRODUTO EM CONTA'
   ELSE 'PRODUTO BARATO' 
END AS STATUS_PRECO, AVG(PRECO_DE_LISTA) AS PRECO_MEDIO
FROM tabela_de_produtos
WHERE sabor = 'Manga'
GROUP BY EMBALAGEM
ORDER BY EMBALAGEM;

E quando eu utilizo o código com o segundo case, me retorna 5 resultados?

Print do resultado: https://ibb.co/s6XWQjb

SELECT EMBALAGEM,
CASE 
   WHEN PRECO_DE_LISTA >= 12 THEN 'PRODUTO CARO'
   WHEN PRECO_DE_LISTA >= 7 AND PRECO_DE_LISTA < 12 THEN 'PRODUTO EM CONTA'
   ELSE 'PRODUTO BARATO' 
END AS STATUS_PRECO, AVG(PRECO_DE_LISTA) AS PRECO_MEDIO
FROM tabela_de_produtos
WHERE sabor = 'Manga'
GROUP BY EMBALAGEM, 
CASE 
   WHEN PRECO_DE_LISTA >= 12 THEN 'PRODUTO CARO'
   WHEN PRECO_DE_LISTA >= 7 AND PRECO_DE_LISTA < 12 THEN 'PRODUTO EM CONTA'
   ELSE 'PRODUTO BARATO' 
END 
ORDER BY EMBALAGEM;

O que eu entendi: Quando eu utilizo o segundo código, que contém o CASE no GROUP BY, o mysql calcula a média para cada critério do CASE, retornando 5 resultados.

O que eu não entendi: Por que quando eu utilizo o primeiro código, ele não retorna 5 resultados também?

1 resposta
solução!

Acabei descobrindo o que queria pessoal, após passar a madrugada pensando nisso.

Irei explicar para futuros alunos com a mesma dúvida.

Eu criei uma tabela para fazer testes com os seguintes dados:

id,nome,valor
1,a,2
2,a,7
3,a,12
4,b,7
5,b,2
6,b,12
7,c,12
8,c,6
9,c,3

Executei o comando abaixo, semelhante ao do curso para entender o que estava acontecendo.

SELECT NOME,
CASE 
   WHEN VALOR >= 11 THEN 'MAIOR_QUE_10'
   WHEN VALOR >= 6 AND VALOR <= 10 THEN 'ENTRE_5_E_10'
   ELSE 'MENOR_QUE_6' 
END AS STATUS, AVG(VALOR) AS PRECO_MEDIO
FROM TESTE
GROUP BY NOME
ORDER BY NOME;

(Perceba que "a", "b" e "c" no banco de dados possuem registros que entram em cada um dos critérios do CASE).

O retorno do código foi esse:

NOME,STATUS,PRECO_MEDIO
a,MENOR_QUE_6,7.0000
b,ENTRE_5_E_10,7.0000
c,MAIOR_QUE_10,7.0000

A pergunta inicial, traduzida para essa tabela seria: Como o Mysql classificou o nome = 'a' como "MENOR_QUE_6", sendo que ele possui registros que entram nos outros critérios "ENTRE_5_E_10" e "MAIOR_QUE_10" do CASE?

A resposta na minha concepção é que ele simplesmente considera o resultado do primeiro registro. Se você reparar na tabela, não foi atoa que eu criei os registros nessa ordem.

A primeira aparição do registro nome = A contém o valor 2, logo ele classifica como "MENOR_QUE_6" e desconsidera os outros registros que são maior que 6.

A primeira aparição do registro B contém o valor 7, logo ele classifica como "ENTRE_5_E_10" e desconsidera os outros registros que entrariam nos critérios "MAIOR_QUE_10" e "MENOR_QUE_6".

Realmente essa classificação não é útil na minha opinião, creio que seria necessário fazer mais filtros para torna-la vantajosa.