SQL-Fehler beheben: „Spalten müssen in einer GROUP BY-Klausel erscheinen oder als Aggregatfunktion verwendet werden“
Wenn in einer SQL-Abfrage das Auswahlfeld weder in der Klausel GROUP BY
enthalten ist noch ein Aggregationsvorgang ausgeführt wird, wird die Fehlermeldung „Spalte ‚wmname‘ muss in der Klausel GROUP BY erscheinen oder als Aggregatfunktion verwendet werden“ angezeigt .
Konkret versuchen Sie, den maximalen Durchschnitt (avg) für jedes Land (cname) zu ermitteln und gleichzeitig den entsprechenden Ländermanagernamen (wmname) zurückzugeben. Allerdings ist wmname weder in der GROUP BY
-Klausel enthalten noch wird es in einer Aggregatfunktion verwendet.
Mögliche Lösungen:
Es gibt mehrere Möglichkeiten, dieses Problem zu lösen:
Methode 1: Unterabfragen und Joins verwenden
Bei dieser Methode wird eine Unterabfrage erstellt, um den maximalen Durchschnitt für jedes Land zu berechnen, und dann das Ergebnis mit der Originaltabelle verknüpft, um die Namen der Ländermanager zu enthalten.
<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>
Methode 2: Fensterfunktion verwenden
Fensterfunktionen bieten eine Möglichkeit, dieses Ergebnis ohne Verwendung einer Unterabfrage zu erhalten.
<code class="language-sql">SELECT cname, wmname, MAX(avg) OVER (PARTITION BY cname) AS mx FROM makerar;</code>
Methode 3: Verwenden Sie DISTINCT und ROW_NUMBER()
Ein expliziterer Ansatz besteht darin, DISTINCT
zu verwenden, um eindeutige Ergebnisse sicherzustellen und ROW_NUMBER()
nur die Zeilen mit dem höchsten Durchschnitt pro Land auszuwählen.
<code class="language-sql">SELECT DISTINCT /* distinct here matters, because maybe there are various tuples for the same max value */ m.cname, m.wmname, t.avg AS mx FROM ( SELECT cname, wmname, avg, ROW_NUMBER() OVER (PARTITION BY cname ORDER BY avg DESC) AS rn FROM makerar ) t JOIN makerar m ON m.cname = t.cname AND m.wmname = t.wmname AND t.rn = 1;</code>
Mit einer dieser Methoden können Sie die erwarteten Ergebnisse abrufen, bei denen der Name des Ländermanagers (wmname) korrekt mit dem maximalen Durchschnitt für jedes Land verknüpft ist. Bitte beachten Sie die ROW_NUMBER()
-Klausel von ORDER BY
in Methode drei, die für die korrekte Auswahl des maximalen Durchschnitts entscheidend ist. In früheren Versionen fehlte diese Klausel, was zu falschen Ergebnissen führen konnte.
Das obige ist der detaillierte Inhalt vonWie löse ich „Spalte ‚wmname' muss in der GROUP BY-Klausel erscheinen oder in einer Aggregatfunktion verwendet werden' in SQL?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!