Heim > Datenbank > MySQL-Tutorial > Wie löse ich „Spalte ‚wmname' muss in der GROUP BY-Klausel erscheinen oder in einer Aggregatfunktion verwendet werden' in SQL?

Wie löse ich „Spalte ‚wmname' muss in der GROUP BY-Klausel erscheinen oder in einer Aggregatfunktion verwendet werden' in SQL?

Barbara Streisand
Freigeben: 2025-01-18 13:56:11
Original
397 Leute haben es durchsucht

How to Solve

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>
Nach dem Login kopieren

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>
Nach dem Login kopieren

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>
Nach dem Login kopieren

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!

Quelle:php.cn
Erklärung dieser Website
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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage