GROUP BY kombiniert mit ORDER BY
Der GROUP BY-Klausel gruppiert die Zeilen, aber es muss nicht unbedingt die Sortierung der Ergebnisse in einer bestimmten Reihenfolge. Um die Reihenfolge zu ändern, verwenden Sie die ORDER BY-Klausel, die nach dem GROUP BY-Klausel. Die verwendeten Spalten in der ORDER BY-Klausel müssen in der Auswahlliste angezeigt werden, das ist im Gegensatz zu der normalen Verwendung von ORDER BY. [Oracle by Example, vierte Auflage, Seite 274]
Warum ist das so? Warum nicht mit der GRUPPE, INDEM Sie Einfluss auf die erforderlichen Spalten in die SELECT-Klausel?
Außerdem in dem Fall, wo ich nicht mit GROUP BY: Warum würde ich wollen, UM DURCH einige Spalten, sondern wählen Sie nur eine Teilmenge der Spalten?
- Zur Beantwortung deiner zweiten Frage: vielleicht ist die Spalte ist ausschließlich für die Bestellung, wie ein
display_order
Spalte. Sie kümmern sich nicht für Sie in die Ergebnisse, sondern die Sie bestellen möchten, indem Sie es.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Eigentlich die Aussage ist nicht ganz richtig als Dave Costa ' s Beispiel zeigt.
In der Oracle-Dokumentation sagt, dass ein Ausdruck benutzt werden kann, aber der Ausdruck muss auf der Grundlage der Spalten in der Auswahlliste.
Aus der gleichen Arbeit Seite 19-13 und 19-33 (Seite 1355 und 1365 in der PDF)
http://docs.oracle.com/cd/E11882_01/server.112/e26088/statements_10002.htm#SQLRF01702
http://docs.oracle.com/cd/E11882_01/server.112/e26088/statements_10002.htm#i2171079
Den Fett gedruckten text aus deinem Zitat ist falsch (es ist wohl eine starke Vereinfachung, die wahr ist in viele gängige Anwendungsfälle, aber es ist nicht unbedingt wahr, als eine Anforderung). Zum Beispiel, diese Anweisung ganz gut, obwohl
AVG(val)
ist nicht in der select-Liste:Den Ausdruck in der ORDER BY-Klausel muss einfach möglich sein, zu evaluieren, im Kontext der GRUPPE DURCH. Zum Beispiel
ORDER BY val
nicht funktionieren würde im obigen Beispiel, weil der Ausdruckval
keinen eindeutigen Wert für jede Zeile produziert von der Gruppierung.Als zu deiner zweiten Frage, können Sie kümmern sich um die Bestellung, aber nicht über den Wert der Bestellung Ausdruck. Ohne unnötige Ausdrücken aus der select-Listen verringert die Menge an Daten, die tatsächlich gesendet werden, vom server an den client.
Erste:
Die Implementierung von group by ist eine, die erstellt eine neue Ergebnismenge, die sich in Ihrer Struktur auf die original-from-Klausel (Tabelle, view oder einige verknüpften Tabellen). Das resultset ist definiert durch das, was ausgewählt ist.
Nicht jeder SQL-RDBMS hat diese Einschränkung, aber es ist immer die Anforderung, dass das, was bestellt wird, indem entweder eine Aggregatfunktion, die von den nicht-gruppierten Spalten (
AVG
,SUM
, etc) oder eine der Spalten gruppiert sind, oder Funktionen, die auf mehr als eines dieser Ergebnisse (wie das hinzufügen von zwei Spalten), denn dies ist eine logische Forderung aus dem Ergebnis der Gruppierung Betrieb.Zweite:
Weil Sie nur die Sorge um, dass die Spalte für die Bestellung. Zum Beispiel könnten Sie haben eine Liste der meistverkauften singles ohne Angabe von deren Umsatz (der NYT-Bestseller hält einige details von Ihren Daten ein Geheimnis, aber tun Sie haben eine Rangliste). Natürlich, Sie können dies umgehen, indem Sie einfach die Auswahl, die Spalte und dann nicht verwenden.
Werden die Daten aggregiert werden, bevor es ist sortiert nach der REIHENFOLGE DURCH.
Wenn Sie versuchen, um durch eine andere Spalte (das ist nicht in der group by-Liste oder eine aggregation function), welcher Wert verwendet werden würde? Es gibt keinen einzigen Wert zu verwenden, für die Bestellung.
Ich glaube, dass Sie verwenden können Kombinationen der Werte für die Sortierung. Man kann also sagen:
Wenn a und b sind in der Gruppe durch. Sie können einfach nicht vorstellen Spalten nicht erwähnt in der WÄHLEN Sie. Ich glaube, Sie können Aggregatfunktionen nicht erwähnt in der WÄHLEN allerdings.
SELECT a, SUM(c) FROM xx GROUP BY a, b ORDER BY a+b
wäre ungültig?WITH DATA AS (SELECT mod(LEVEL,3) grp, LEVEL val FROM dual CONNECT BY LEVEL < 100) SELECT MIN(val),MAX(val) FROM DATA GROUP BY grp ORDER BY grp
-- GFK ist nicht in der select-Liste, kann aber noch werden, auf die in der order-by.Beispieltabelle
Erste Abfrage mit GROUP BY
Ausgabe
Zweite Abfrage mit order by
Ausgabe
Dritte Abfrage mit GROUP BY und Bestellung
Ausgabe
Sobald Sie anfangen über Dinge wie Zählen, müssen Sie der Gruppe durch. Sie können Sie zusammen, aber Sie haben sehr unterschiedliche verwendet wird, wie ich hoffe, die Beispiele zeigen deutlich.
Versuchen, die Frage zu beantworten, warum die Gruppe durch die Wirkung der Elemente in der select-Abschnitt, weil das ist, was group by bedeutete, zu tun. Sie können nicht die Anzahl der ein-Spalte, wenn Sie keine group by-Spalte.
Zweite Frage, warum würden Sie wollen, um die von aber nicht Auswahl aller Spalten?
Wenn ich will, um durch die Partitur, aber kümmern sich nicht um den tatsächlichen Grad oder sogar die Kerbe, die ich tun könnte,
Ausgabe
SELECT grade FROM sample.grades GROUP BY Grade ORDER BY COUNT(grade)
ist ungültig.Welche Ergebnisse erwarten Sie, um zu sehen, Bestellung von Spalten nicht in der select-Liste und nicht teilgenommen in der group by-Klausel? auf jeden Fall sind alle Art von Art von nicht-erwähnt in der SELECT-Liste werden Spalten weggelassen, so Oracle-Jungs Hinzugefügt die Einschränkung richtig.
ORDER BY COUNT(*)
aber nicht tatsächlich wiederCOUNT(*)
in das ResultSet?ORDER BY COUNT(*)
funktioniert - dies widerspricht den OP ' s zitieren!Hier meine inderstanding
"Der GROUP BY-Klausel gruppiert die Zeilen, aber es muss nicht unbedingt die Sortierung der Ergebnisse in einer bestimmten Reihenfolge."
-> Sie können, verwenden Sie Group by ohne order by
"Um die Reihenfolge zu ändern, verwenden Sie die ORDER BY-Klausel, die nach dem GROUP BY-Klausel."
-> die Zeilen werden ausgewählt, indem Sie Fehler mit den primär-Schlüssel, und wenn Sie hinzufügen, um durch Sie müssen, fügen Sie nach der Gruppe von
"Der verwendeten Spalten in der ORDER BY-Klausel müssen in der Auswahlliste angezeigt werden, das ist im Gegensatz zu der normalen Verwendung von ORDER BY."
ORDER BY
Klausel erscheinen in derSELECT
Liste. Und jetzt mit dem Bearbeiten, da gibt es keine Erklärung mehr.