سؤال

لماذا لا يمكنني استخدام عمود مؤقت في بند أين؟

وعلى سبيل المثال، هذا الاستعلام:

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

وهذا سوف أعطيك كل product_brands التي لديها count > 50 وسوف تظهر لك أيضا العد لكل منها.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top