Como usar uma coluna temporária na cláusula WHERE
-
08-07-2019 - |
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'
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.