题
为什么我不能在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
意愿。你的情况也一样。
因为在完成处理之前它不知道该列是什么。
如果要按该名称访问该列,则必须使用子查询,否则您将不必使用您提供的名称来限定该列,重复您的案例陈述。
如果我正确阅读了您的意图,您可以重新编写此查询以阅读:
Select
product_brand,
COUNT(product_brand) AS brand_count
FROM
products
GROUP BY
product_brand
HAVING
COUNT(product_brand) > 50
这将为您提供 count>的所有
,也会告诉你
每个的计数。 product_brands
50
不隶属于 StackOverflow