Frage

Warum kann ich nicht eine temporäre Spalte in der where-Klausel verwenden?

Zum Beispiel dieser Abfrage:

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

Dies bringt zwei Spalten, eine namens product_brand und ein genannt brand_count. brand_count wird on the fly erstellt und ist immer 1 oder 0 abhängig davon, ob oder nicht, es gibt 50 oder Produkte mit dieser Marke.

Das macht alle Sinn für mich, mit der Ausnahme, dass ich nicht nur, wenn brand_count = 1 wie in dieser Abfrage auswählen kann unter:

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

das gibt mir diese Fehlermeldung:

#1054 - Unknown column 'brand_count' in 'where clause' 
War es hilfreich?

Lösung

Verwenden HAVING statt:

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 ausgewertet vor die GROUP BY. HAVING ausgewertet nach.

Andere Tipps

Da in SQL die Spalten zuerst „ausgewählt“ und dann „projiziert“.

Sie haben die volle Klausel verwenden, so benötigen Sie:

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

Dies ist das gleiche für all berechnetes Feld in einer SQL-Anweisung ist.

Zur Vereinfachung:

Select Max(Points) as Highest where Highest > 10

wird nicht funktionieren, aber:

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

Willen. Es ist das gleiche in Ihrem Fall.

Weil es hat keine Ahnung, was diese Spalte bis ist, nachdem es die Verarbeitung fertig ist.

Wenn Sie die Spalte mit diesem Namen zugreifen möchten würden Sie eine Unterabfrage verwenden müssen, sonst wirst du die Spalte ohne den Namen zu haben, zu qualifizieren Sie es gab, Ihren Fall Anweisung wiederholen.

Wenn ich Ihre Absicht richtig gelesen haben, können Sie diese Abfrage neu schreiben, zu lesen:

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

Dies wird Ihnen alle product_brands, die eine count > 50 haben und zeigt Ihnen auch, die Zählung für jeden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top