Wie eine temporäre Spalte in der where-Klausel verwenden,
-
08-07-2019 - |
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'
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.