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' 
È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top