Как использовать столбец temp в предложении where

StackOverflow https://stackoverflow.com/questions/630815

  •  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 , а также покажет вам количество для каждого.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top