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

Dúvida no uso de where e ao colocar para exibir o campo sabores

estou com dúvida no uso desses dois comandos esse primeiro com where

SELECT EMBALAGEM, SABOR,
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

esse segundo sem uso de where

SELECT EMBALAGEM, SABOR,
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 
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;

porque quando eu uso o where sendo o sabor de manga ele acha o sabor de manga e quando eu não uso o where não tem nenhum sabor de manga ? o case ele precisa de group by ? qual é a relação dele com as funções de agregação ( max , count , min ..) ?

1 resposta
solução!

Oii Daniel, como você está?

Sinto muito pela demora em obter um retorno.

O CASE é utilizado para criar uma estrutura de controle para testar condições. O CASE, diferente do MAX, MIN, AVG, COUNT e SUM não é uma função de agregação, então, não precisamos utilizar a cláusula group by ao utilizar o CASE em uma consulta.

Em relação a execução das queries, ao utilizar a condição: where SABOR = 'Manga', apenas os produtores que têm o sabor igual a Manga serão retornados.

SELECT EMBALAGEM, SABOR,
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

Quando esta condição é retirada, o resultado retornado será de acordo com o agrupamento realizado.

O primeiro agrupamento é realizado pela embalagem, o segundo pelo sabor e por último, pelo CASE, então, será retornado da seguinte forma:

  • O primeiro produto barato, o primeiro produto conta e o primeiro produto caro para a embalagem garrafa

  • O primeiro produto barato para a embalagem Lata

  • O primeiro produto em conta e o primeiro produto caro para a embalagem PET

SELECT EMBALAGEM, SABOR,
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 
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;

Execução da query `SELECT EMBALAGEM, SABOR,
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 
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;` onde o resultado obtido foi: Na coluna embalagem temos as embalagens: garrafa 3 vezes seguidas, PET 2 vezes e Lata. Na coluna sabor: Uva, Açai, Cereja/Maça, melancia duas vezes seguida e Lima/Limão. Na coluna Status Preço: PRODUTO BARATO,PRODUTO CARO, PRODUTO EM CONTA, PRODUTO BARATO, PRODUTO CARO e PRODUTO EM CONTA. Na coluna preco_medio: 5.2305000225702925,13. 312000274658203, 8.059625029563904, 3.998699951171875, 20.409749889373778 e 109000110626221

Ao executar a query sem utilizar a função de agregação, podemos identificar que os primeiros produtos, são exatamente os retornados na query anterior:

SELECT EMBALAGEM, SABOR,
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
FROM tabela_de_produtos
ORDER BY EMBALAGEM;
  • Garrafa

Resultado da query sem a utilização da função de agregação e o group by, onde o primeiro produto barato, o primeiro produto em  conta e primeiro produto caro para a embalagem garrafa, estão destacados com um retângulo vermelho sem preenchimento

  • Lata

Resultado da query sem a utilização da função de agregação e o group by, onde o primeiro produto barato para a embalagem Lata, esta destacado com um retângulo vermelho sem preenchimento

  • PET

Resultado da execução da query sem a utilização da função de agregação e o group by, onde o primeiro produto em conta e primeiro produto caro para a embalagem PET, estão destacados com um retângulo vermelho sem preenchimento

Espero ter ajudado e bons estudos!