Pergunta

Por que não posso usar uma coluna temporária na cláusula onde?

Por exemplo, esta consulta:

Select 
    product_brand, 
    (CASE WHEN COUNT(product_brand)>50 THEN 1 ELSE 0 END) AS brand_count 
FROM 
    products 
WHERE 
    1 
GROUP BY 
    product_brand

Isso traz duas colunas, uma chamada product_brand e um chamado brand_count. brand_count é criado na mosca e é sempre 1 ou 0 dependendo se há ou não 50 ou produtos com essa marca.

Tudo isso faz sentido para mim, exceto que eu não pode selecionar somente se brand_count = 1 como nesta consulta abaixo:

Select 
    product_brand, 
   (CASE WHEN COUNT(product_brand)>50 THEN 1 ELSE 0 END) AS brand_count 
FROM 
    products 
WHERE 
   brand_count = 1 
GROUP BY 
   product_brand

que me dá este erro:

#1054 - Unknown column 'brand_count' in 'where clause' 
Foi útil?

Solução

Use HAVING vez:

Select
    product_brand,
    (CASE WHEN COUNT(product_brand)>50 THEN 1 ELSE 0 END) AS brand_count
  FROM products
  GROUP BY product_brand
  HAVING brand_count = 1

WHERE é avaliada antes o GROUP BY. HAVING é avaliada após.

Outras dicas

Porque em SQL as colunas são de primeira "selecionada" e depois "projectada".

Você tem que usar a cláusula completa, então você vai precisar:

Select 
  product_brand, 
  (CASE WHEN COUNT(product_brand)>50 THEN 1 ELSE 0 END) AS brand_count 
FROM products 
WHERE 
  (CASE WHEN COUNT(product_brand)>50 THEN 1 ELSE 0 END)  = 1 
GROUP BY product_brand

Este é o mesmo para qualquer campo calculado em qualquer instrução SQL.

Para simplificar:

Select Max(Points) as Highest where Highest > 10

não vai funcionar, mas:

Select Max(Points) as Highest where Max(Points) > 10

vontade. É o mesmo no seu caso.

Porque ele não tem idéia do que essa coluna é depois que é feito o processamento.

Se você quiser acessar a coluna com esse nome, você teria que usar uma subconsulta, caso contrário você vai ter para se qualificar a coluna sem o nome que você deu, repetindo sua declaração caso.

Se eu ler a sua intenção corretamente, você pode re-escrever esta consulta para ler:

Select 
 product_brand,
 COUNT(product_brand) AS brand_count 
FROM 
 products 
GROUP BY 
 product_brand
HAVING 
 COUNT(product_brand) > 50

Isto lhe dará toda product_brands que têm uma count > 50 e também irá mostrar-lhe a contagem para cada um.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top