Come utilizzare una colonna temporanea nella clausola where
-
08-07-2019 - |
Domanda
Perché non posso usare una colonna temporanea nella clausola where?
Ad esempio, questa query:
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
Questo fa apparire due colonne, una chiamata product_brand
e una chiamata brand_count
. brand_count
viene creato al volo ed è sempre 1 o 0 a seconda che ci siano 50 o meno prodotti con quel marchio.
Tutto questo ha senso per me, tranne per il fatto che non posso selezionare solo se brand_count = 1
come in questa query di seguito:
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
che mi dà questo errore:
#1054 - Unknown column 'brand_count' in 'where clause'
Soluzione
Usa HAVING
invece:
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
DOVE
viene valutato prima di il GROUP BY
. HAVING
viene valutato dopo.
Altri suggerimenti
Perché in SQL le colonne sono prima " selezionate " e quindi "proiettato".
Devi usare la clausola completa, quindi avrai bisogno di:
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
Questo è lo stesso per qualsiasi campo calcolato in qualsiasi istruzione SQL.
Per semplificare:
Select Max(Points) as Highest where Highest > 10
non funzionerà, ma:
Select Max(Points) as Highest where Max(Points) > 10
volontà. È lo stesso nel tuo caso.
Perché non ha idea di cosa sia quella colonna fino a quando non ha terminato l'elaborazione.
Se vuoi accedere alla colonna con quel nome dovresti usare una sottoquery, altrimenti dovrai qualificare la colonna senza il nome che le hai dato, ripetendo la tua dichiarazione del caso.
Se ho letto correttamente le tue intenzioni, puoi riscrivere questa query per leggere:
Select
product_brand,
COUNT(product_brand) AS brand_count
FROM
products
GROUP BY
product_brand
HAVING
COUNT(product_brand) > 50
Questo ti darà tutti i product_brands
che hanno un count > 50
e ti mostrerà anche
il conteggio per ciascuno.