Comment utiliser une colonne temp dans la clause where
-
08-07-2019 - |
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'
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.