Sie haben das DBMS nicht erwähnt. Angenommen, Sie verwenden MS SQL-Server, habe ich eine selbsterklärende T-SQL-Fehlermeldung gefunden:
"Ein Aggregat wird möglicherweise nicht in der WHERE-Klausel angezeigt, es sei denn, es befindet sich in einer Unterabfrage, die in einer HAVING-Klausel oder einer Auswahlliste enthalten ist, und die zu aggregierende Spalte ist eine äußere Referenz."
http://www.sql-server-performance.com/
Und ein Beispiel, dass es in einer Unterabfrage möglich ist.
Alle Kunden und kleinste Bestellung für diejenigen anzeigen, die 5 oder mehr Bestellungen haben (und NULL für andere):
SELECT a.lastname
, a.firstname
, ( SELECT MIN( o.amount )
FROM orders o
WHERE a.customerid = o.customerid
AND COUNT( a.customerid ) >= 5
)
AS smallestOrderAmount
FROM account a
GROUP BY a.customerid
, a.lastname
, a.firstname ;
AKTUALISIEREN.
Das obige läuft sowohl in SQL-Server als auch in MySQL, gibt aber nicht das erwartete Ergebnis zurück. Der nächste ist näher. Ich denke, es hat damit zu tun, dass das Feld customerid
GROUPed BY, das im Abfrage-Unterabfrage-Join verwendet wird, im ersten Fall PRIMARY KEY der äußeren Tabelle ist und im zweiten Fall nicht.
Alle Kunden-IDs und Anzahl der Bestellungen für diejenigen anzeigen, die 5 oder mehr Bestellungen haben (und NULL für andere):
SELECT o.customerid
, ( SELECT COUNT( o.customerid )
FROM account a
WHERE a.customerid = o.customerid
AND COUNT( o.customerid ) >= 5
)
AS cnt
FROM orders o
GROUP BY o.customerid ;
HAVING ist wie WHERE mit Aggregatfunktionen, oder Sie könnten eine Unterabfrage verwenden.
select EmployeeId, sum(amount) from Sales group by Employee having sum(amount) > 20000
Oder
select EmployeeId, sum(amount) from Sales group by Employee where EmployeeId in ( select max(EmployeeId) from Employees)
quelle
Sie können ein Aggregat nicht direkt in einer WHERE-Klausel verwenden. Dafür gibt es HAVING-Klauseln.
Sie können eine Unterabfrage verwenden, die ein Aggregat in der WHERE-Klausel enthält.
quelle
AKTUALISIERTE Abfrage:
select id from t where id < (select max(id) from t);
Es werden alle bis auf die letzte Zeile aus der Tabelle t ausgewählt.
quelle
SELECT id FROM t WHERE id < (SELECT MAX(id) FROM t)
SELECT COUNT( * ) FROM agents HAVING COUNT(*)>3;
Weitere Informationen finden Sie unter dem folgenden Link:
http://www.w3resource.com/sql/aggregate-functions/count-having.php#sthash.90csRM4I.dpuf weibl. [1 ] Rufen Sie mich an, wenn Sie Fragen haben: 85110 51548
http://www.w3resource.com/sql/aggregate-functions/count-having.php
quelle
Eine andere Lösung besteht darin, die Aggregatfunktion in die benutzerdefinierte Skalarfunktion zu verschieben
Erstellen Sie Ihre Funktion:
CREATE FUNCTION getTotalSalesByProduct(@ProductName VARCHAR(500)) RETURNS INT AS BEGIN DECLARE @TotalAmount INT SET @TotalAmount = (select SUM(SaleAmount) FROM Sales where Product=@ProductName) RETURN @TotalAmount END
Verwenden Sie die Funktion in der Where-Klausel
SELECT ProductName, SUM(SaleAmount) AS TotalSales FROM Sales WHERE dbo.getTotalSalesByProduct(ProductName) > 1000 GROUP BY Product
Verweise:
1. 2.
Hoffnung hilft jemandem.
quelle