Wenn in SQL eine Aggregationsoperation durchgeführt wird (z. B. das Ermitteln des Maximalwerts), müssen die für die Aggregation verwendeten Spalten auch in der GROUP BY-Klausel erscheinen. Andernfalls wird der Fehler angezeigt: „Spalte muss in einer GROUP BY-Klausel erscheinen oder als Aggregatfunktion verwendet werden.“
Angenommen, Sie möchten den maximalen Durchschnittswert (avg) für jeden Kundennamen (cname) in der Tabelle finden:
<code class="language-sql">SELECT cname, wmname, MAX(avg) FROM makerar GROUP BY cname;</code>
Diese Abfrage gibt einen Fehler zurück, da wmname nicht in der GROUP BY-Klausel enthalten ist. Um dies zu beheben, können Sie einfach nach cname und wmname gruppieren:
<code class="language-sql">SELECT cname, wmname, MAX(avg) FROM makerar GROUP BY cname, wmname;</code>
Diese Methode liefert jedoch nicht das erwartete Ergebnis, nämlich die Anzeige des maximalen Durchschnittswerts für jeden eindeutigen C-Namen. Stattdessen wird es nach cname und wmname gruppiert, was zu mehreren Zeilen pro cname führt. Um dieses Problem zu beheben, befolgen Sie eine der folgenden Methoden:
<code class="language-sql">SELECT cname, MAX(avg) AS mx FROM makerar GROUP BY cname;</code>
<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>
Mit Fensterfunktionen können Sie zeilenübergreifende Berechnungen innerhalb eines bestimmten Fensters durchführen. In diesem Fall können Sie die PARTITION BY-Klausel verwenden, um nach cname zu gruppieren und den maximalen Durchschnittswert in jeder Partition zu berechnen:
<code class="language-sql">SELECT cname, wmname, MAX(avg) OVER (PARTITION BY cname) AS mx FROM makerar;</code>
Diese Methode zeigt alle Datensätze an, zeigt jedoch korrekt den maximalen Durchschnittswert pro Cname und Zeile an.
Wenn Sie nur die eindeutigen Tupel anzeigen möchten, die dem maximalen Durchschnittswert entsprechen, können Sie die folgende Methode verwenden:
<code class="language-sql">SELECT cname, wmname, avg, ROW_NUMBER() OVER (PARTITION BY cname ORDER BY avg DESC) AS rn FROM makerar;</code>
<code class="language-sql">SELECT DISTINCT /* distinct matters here */ 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>
Diese Methode gibt eine Liste eindeutiger Tupel zurück, die den maximalen Durchschnittswert für jeden C-Namen enthalten. Beachten Sie den Zusatz ORDER BY avg DESC
, um sicherzustellen, dass die Rangfolge in absteigender Reihenfolge basierend auf avg
erfolgt.
Das obige ist der detaillierte Inhalt vonWie löst man den SQL-Fehler „Spalte muss in der GROUP BY-Klausel erscheinen'?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!