10

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これにより、 と呼ばれる列とと呼ばれる列の 2 つの列が表示されbrand_countます。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' 
4

5 に答える 5

15

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後に評価されます。

于 2009-03-10T15:40:44.670 に答える
3

SQLでは、列は最初に「選択」され、次に「射影」されるためです。

于 2009-03-10T15:40:50.597 に答える
2

完全な句を使用する必要があるため、次のものが必要になります。

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

意思。あなたの場合も同じです。

于 2009-03-10T15:41:09.707 に答える
1

処理が完了するまで、その列が何であるかがわからないためです。

その名前で列にアクセスする場合は、サブクエリを使用する必要があります。それ以外の場合は、名前を付けずに列を修飾し、case ステートメントを繰り返す必要があります。

于 2009-03-10T15:40:33.453 に答える
0

あなたの意図を正しく読んだら、このクエリを次のように書き直すことができます。

Select 
 product_brand,
 COUNT(product_brand) AS brand_count 
FROM 
 products 
GROUP BY 
 product_brand
HAVING 
 COUNT(product_brand) > 50

product_brandsこれにより、 を持つすべてのものが得count > 50られ、それぞれのカウントも表示されます。

于 2009-03-10T15:48:41.780 に答える