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'?

Warum schlägt meine SQL-Abfrage fehl mit „muss in der GROUP BY-Klausel erscheinen oder in einer Aggregatfunktion verwendet werden'?

Mary-Kate Olsen
Mary-Kate OlsenOriginal
2025-01-18 14:11:10784Durchsuche

Why Does My SQL Query Fail with

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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn