Heim >Datenbank >MySQL-Tutorial >Warum schlägt meine SQL-Abfrage fehl mit „muss in der GROUP BY-Klausel erscheinen oder in einer Aggregatfunktion verwendet werden'?
SQL-Abfragefehler beheben: „Muss in der GROUP BY-Klausel erscheinen oder in einer Aggregatfunktion verwendet werden“
In SQL müssen beim Ausführen von Aggregatoperationen (wie MAX, MIN, SUM usw.) die Spalten in der SELECT
-Liste in der GROUP BY
-Klausel erscheinen oder in einer Aggregatfunktion enthalten sein. Diese Einschränkung stellt sicher, dass Ergebnisse korrekt gruppiert und Aggregatwerte korrekt berechnet werden.
Angenommen, Ihre Tabelle enthält die Spalten cname
, wmname
und avg
und Sie möchten den maximalen cname
-Wert für jedes avg
ermitteln. Ihre ursprüngliche Anfrage lautet wie folgt:
<code class="language-sql">SELECT cname, wmname, MAX(avg) FROM makerar GROUP BY cname;</code>
Diese Abfrage schlägt fehl, da die Spalte wmname
weder in der Klausel GROUP BY
enthalten ist noch in einer Aggregatfunktion verwendet wird. Dies bedeutet, dass die Aggregatfunktion MAX
ohne Gruppierung nach wmname
ausgewertet wird, was zu falschen Ergebnissen führt.
Die folgenden Methoden können dieses Problem lösen:
Methode 1: Fügen Sie wmname
in die GROUP BY
-Klausel ein:
<code class="language-sql">SELECT cname, wmname, MAX(avg) FROM makerar GROUP BY cname, wmname;</code>
Diese Methode gibt den maximalen cname
-Wert für jede wmname
- und avg
-Kombination zurück.
Methode 2: Unterabfrage verwenden:
<code class="language-sql">SELECT m.cname, m.wmname, t.mx FROM ( SELECT cname, MAX(avg) AS mx FROM makerar GROUP BY cname ) t JOIN makerar m ON m.cname = t.cname AND t.mx = m.avg;</code>
Diese Methode berechnet zunächst den maximalen cname
-Wert für jeden avg
mithilfe einer Unterabfrage und verknüpft ihn dann mit der Originaltabelle, um den entsprechenden wmname
-Wert abzurufen.
Methode 3: Fensterfunktion verwenden:
<code class="language-sql">SELECT cname, wmname, MAX(avg) OVER (PARTITION BY cname) AS mx FROM makerar;</code>Die
Fensterfunktion MAX(avg) OVER (PARTITION BY cname)
berechnet den maximalen cname
-Wert für jeden avg
und behält alle Zeilen im Ergebnis bei. Diese Methode zeigt jedoch möglicherweise doppelte Zeilen an, wenn mehrere Zeilen mit demselben maximalen cname
-Wert für ein bestimmtes avg
vorhanden sind.
Durch die korrekte Einhaltung der Anforderung, dass nicht aggregierte Funktionsspalten in der GROUP BY
-Klausel erscheinen müssen, können Sie sicherstellen, dass aggregierte Abfragen genaue und aussagekräftige Ergebnisse liefern.
Das obige ist der detaillierte Inhalt vonWarum schlägt meine SQL-Abfrage fehl mit „muss in der GROUP BY-Klausel erscheinen oder in einer Aggregatfunktion verwendet werden'?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!