Как использовать столбец temp в предложении where
-
08-07-2019 - |
Вопрос
Почему я не могу использовать временный столбец в предложении where?
Например, этот запрос:
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
Это приводит к появлению двух столбцов, один из которых называется product_brand
и один из них позвонил brand_count
. brand_count
создается "на лету" и всегда равен 1 или 0 в зависимости от того, есть ли 50 или более продуктов с этим брендом.
Все это имеет смысл для меня, за исключением того, что я не могу выбрать, только если brand_count = 1
как в этом запросе ниже:
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
что выдает мне эту ошибку:
#1054 - Unknown column 'brand_count' in 'where clause'
Решение
Вместо этого используйте HAVING
:
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
оценивается перед GROUP BY
. HAVING
оценивается после.
Другие советы
Потому что в SQL столбцы сначала "выделены" и затем "спроецированный". Р>
Вы должны использовать полное предложение, поэтому вам понадобится:
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
Это одно и то же для любого вычисляемого поля в любом операторе SQL .
Для упрощения:
Select Max(Points) as Highest where Highest > 10
это не сработает, но:
Select Max(Points) as Highest where Max(Points) > 10
уилл.То же самое и в вашем случае.
Потому что он не знает, что это за столбец, пока не выполнит обработку.
Если вы хотите получить доступ к столбцу с таким именем, вам нужно будет использовать подзапрос, в противном случае вам нужно будет указать столбец без имени, которое вы ему дали, повторив оператор case.
Если я правильно прочитал ваше намерение, вы можете переписать этот запрос так:
Select
product_brand,
COUNT(product_brand) AS brand_count
FROM
products
GROUP BY
product_brand
HAVING
COUNT(product_brand) > 50
Это даст вам все product_brands
, у которых есть count > 50
, а также покажет вам
количество для каждого.