Question

Pourquoi ne puis-je pas utiliser une colonne temporaire dans la clause where?

Par exemple, cette requête:

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

Ceci fait apparaître deux colonnes, l'une appelée product_brand et l'autre appelée brand_count . brand_count est créé à la volée et est toujours égal à 1 ou à 0 selon qu'il existe ou non 50 produits ou des produits de cette marque.

Tout cela a du sens pour moi, sauf que je ne peux pas sélectionner uniquement si brand_count = 1 comme dans la requête ci-dessous:

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

qui me donne cette erreur:

#1054 - Unknown column 'brand_count' in 'where clause' 
Était-ce utile?

La solution

Utilisez HAVING à la place:

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 est évalué avant le GROUP BY . HAVING est évalué après.

Autres conseils

Parce qu'en SQL, les colonnes sont d'abord "sélectionnées" et ensuite "projeté".

Vous devez utiliser la clause complète, vous aurez donc besoin de:

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

Il en va de même pour tous les champs calculés dans les instructions SQL.

Pour simplifier:

Select Max(Points) as Highest where Highest > 10

ne fonctionnera pas, mais:

Select Max(Points) as Highest where Max(Points) > 10

sera. C'est la même chose dans votre cas.

Parce qu'il n'a aucune idée de ce qu'est cette colonne avant le traitement.

Si vous souhaitez accéder à la colonne de ce nom, vous devez utiliser une sous-requête, sinon vous devrez qualifier la colonne sans le nom que vous lui avez donné, en répétant votre déclaration de cas.

Si je lis correctement votre intention, vous pouvez réécrire cette requête pour lire:

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

Cela vous donnera tous les produits_brands qui ont un nombre > 50 et vous montrera également le compte pour chacun.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top