where句でtemp列を使用する方法
-
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
と呼ばれる列の2つの列が表示されます。 brand_count
はその場で作成され、そのブランドの製品が50個あるかどうかに応じて常に1または0です。
これはすべて私にとって理にかなっていますが、以下のクエリのように 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
これにより、 count>を持つすべての
そしてまた表示されます
それぞれのカウント。 product_brands
が提供されます。 50
所属していません StackOverflow