質問

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 そしてまた表示されます それぞれのカウント。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top