Gruppen sortieren
Das Ergebnis einer Abfrage mit GROUP BY ist eine Tabelle wie jede andere, und du sortierst sie mit ORDER BY. Du kannst sie nach der Spalte sortieren, nach der du gruppierst, wie in der vorherigen Übung, aber auch nach einer Aggregatfunktion. Welche Genres haben die meisten Spiele?
SELECT genre, COUNT(*) AS anzahl_spiele
FROM spiele
GROUP BY genre
ORDER BY COUNT(*) DESC;| genre | anzahl_spiele |
|---|---|
| Action | 4 |
| Strategie | 3 |
| Adventure | 3 |
| Sport | 2 |
| … | … |
Statt die Funktion noch einmal zu schreiben, kannst du nach ihrem Alias sortieren: ORDER BY anzahl_spiele DESC. Das ist kürzer, und wenn du die Funktion später änderst, änderst du sie nur an einer Stelle. Am Ende dieser Lektion erfährst du, warum ein Alias in ORDER BY funktioniert und wo nicht.
Sieh dir das Ergebnis aber genau an. Adventure und Strategie haben je 3 Spiele, und fünf Genres haben 2. Hier kommen die Genres mit gleicher Anzahl zufällig in umgekehrter alphabetischer Reihenfolge, aber nichts garantiert eine Reihenfolge: Eine andere Version der Datenbank oder dieselbe mit mehr Daten kann sie anders liefern. Wie du aus Lektion 2 weißt, entscheidet eine zweite Sortierspalte bei Gleichstand:
SELECT genre, COUNT(*) AS anzahl_spiele
FROM spiele
GROUP BY genre
ORDER BY anzahl_spiele DESC, genre;| genre | anzahl_spiele |
|---|---|
| Action | 4 |
| Adventure | 3 |
| Strategie | 3 |
| Puzzle | 2 |
| … | … |
Mit LIMIT bekommst du die besten Gruppen. Die drei Genres mit dem höchsten Durchschnittspreis:
SELECT genre, ROUND(AVG(preis), 1) AS durchschnittspreis
FROM spiele
GROUP BY genre
ORDER BY durchschnittspreis DESC
LIMIT 3;| genre | durchschnittspreis |
|---|---|
| RPG | 50.0 |
| Sport | 47.5 |
| Action | 32.5 |
Typischer Fehler: LIMIT 1 für „das Genre mit den meisten Spielen“, wenn es einen Gleichstand gibt. Wenn zwei Gruppen den ersten Platz teilen, zeigt LIMIT 1 eine von ihnen, und von der anderen erfährst du nie. Sieh dir ein paar Zeilen mehr an, bevor du das Ergebnis abschneidest, und füge immer eine zweite Sortierspalte hinzu, damit du weißt, welche der gleichauf liegenden Gruppen du bekommst.
So schreibst du es:
Anweisungen
- 1
Welche Kunden haben die meisten Bestellungen aufgegeben? Ändere die Abfrage so, dass sie die Kunden nach der Anzahl der Bestellungen sortiert, die meisten zuerst, Kunden mit gleicher Anzahl nach
kunde_id, und nur die ersten 3 Zeilen zeigt:kunde_id anzahl_bestellungen 1 4 3 4 2 3 - 2
Zeige darunter die 3 Spiele, die Kunden für das meiste Geld bestellt haben, erstattete Bestellungen eingeschlossen:
spiel_idund die Summe vonmenge * preisauspositionenin einer Spaltepositionswert, vom höchsten Wert an:spiel_id positionswert 15 180 1 160 20 105