SkillGridInformatik durch Machen lernen

COUNT, SUM, AVG und GROUP BY: Zeilen ehrlich zusammenfalten

Viele Zeilen zu wenigen Zahlen rollen und nach Artikel gruppieren — und sehen, wie ein Durchschnitt genau das verstecken kann, was du wissen musst.

14 Min. · 45 XP

Filtern verengt eine Tabelle, aber manche Fragen brauchen den umgekehrten Zug: viele Zeilen zu einer Zahl zusammenfalten. Wie viel hat die Kantine heute eingenommen? Wie viele Bestellungen gab es? Das kannst du nicht durch Zeilen zeigen — du brauchst Aggregationsfunktionen, und die Idee kennst du schon: das ist Aggregation über eine Menge, derselbe Zug wie im Logik-Modul, nur auf einer echten Tabelle.

SELECT COUNT(*) FROM sales

4 rows in, 1 row out

SELECT SUM(count) FROM sales

40 + 55 + 23 + 60 = 178Eine Zeile kommt zurück, egal wie viele Zeilen hineingingen.

Die vier Funktionen, die du ständig brauchst: COUNT zählt Zeilen (oder Werte), SUM summiert, AVG liefert den Mittelwert, MAX und MIN geben das Größte und Kleinste. Jede frisst viele Werte und gibt genau einen zurück. COUNT(*) zählt Zeilen wie sie sind; COUNT(paid) zählt nur Zeilen, wo paid nicht NULL ist — der Unterschied ist oft genau die Geschichte.

Die Kantine will eine Zahl pro Gericht: wie viele Einheiten davon insgesamt verkauft wurden. Ohne Gruppieren müsstest du vier einzelne Abfragen schreiben mit WHERE item = 'soup', WHERE item = 'juice' und so weiter. GROUP BY erledigt alle in einer Abfrage und garantiert jedem Gericht genau eine Zeile.

SELECT item, SUM(count)
FROM   sales
GROUP  BY item

+---------+------------+
| item    | SUM(count) |
+---------+------------+
| soup    | 40         |
| juice   | 75         |
| salad   | 23         |
| sandwich| 55         |
+---------+------------+Eine Zeile pro Artikel: Jede Gruppe faltet sich in ihre Summe.

Hier die Mechanik. Die vier Zeilen fallen nach ihrem item-Wert in vier Gruppen. Innerhalb jeder Gruppe addiert SUM(count) die counts. Das Ergebnis hat eine Zeile pro Gruppe — nicht pro ursprünglicher Zeile. Daraus folgt auch, welche Spalten neben dem Aggregat in SELECT stehen dürfen: nur solche, die innerhalb der Gruppe einen einzelnen Wert haben.

SELECT item, price, SUM(count)
FROM   sales
GROUP  BY item

item    -> one value per group
SUM(count) -> one value per group
price   -> many values per group, no single answerWarum die Mischung aus gruppierten und nicht gruppierten Spalten keine Antwort hat.

Jetzt die feinste Falle, und sie braucht gar kein falsches SQL. Die Kantine misst die Schlange in Minuten. Zwei Tage, und die Mittelwerte sind fast gleich. Sagen dir der Mittelwert 3.2 und der Mittelwert 3.4, dass diese Tage ähnlich waren?

queue times in minutes for two days

monday:  1, 1, 1, 1, 12      AVG = 3.2
tuesday: 2, 3, 3, 4, 5       AVG = 3.4

same average, different daysDerselbe Durchschnitt, gebaut aus zwei sehr verschiedenen Tagen.

Montag war ruhig: Vier Schüler warteten eine Minute, ein unglücklicher wartete zwölf. Dienstag war eine gleichmäßige, milde Wartezeit für alle. Die Mittelwerte stimmen überein, die Tage haben nichts gemeinsam. Ein Durchschnitt ist eine Zahl, die die Arbeit einer ganzen Verteilung tut, und für sich allein kann er nicht sagen, ob die Zwölfer selten oder normal sind.

Praxis

  1. Schreibe eine Abfrage, die jeden Artikel mit der Gesamtzahl verkaufter Einheiten zeigt. Die Tabelle sales hat die Spalten item, price und count.

    Hinweise
    • Die Antwort muss eine Zeile pro Artikel sein, und GROUP BY ist es, die eine Zeile pro Gruppe erzeugt.
    • Innerhalb jeder Gruppe brauchst du die Summe von count, also SUM(count).
    • Die Reihenfolge: was du behältst und wie du faltest, steht in SELECT, die Tabelle in FROM, die Gruppierung in GROUP BY.
  2. Ein Mitschüler schreibt: SELECT item, price, SUM(count) FROM sales GROUP BY item. Warum lehnt die Datenbank diese Abfrage ab?

    Hinweise
    • Frag bei jeder Spalte im SELECT: Hat diese Spalte innerhalb einer Gruppe genau einen Wert?
    • item ist die Gruppe selbst, price ist eine andere Zahl auf verschiedenen Zeilen derselben Gruppe.
  3. Die Kantine sieht, dass die durchschnittliche Schlange gestern 10 Minuten betrug. Was ist das Nützlichste, das man prüfen sollte, bevor man einen Schluss zieht?

    Hinweise
    • Ein Durchschnitt von 10 kann aus 10 und 10 gebaut sein oder aus 1 und 19 — in welcher Schlange möchtest du lieber stehen?
    • Die Kantine braucht die genaue Liste nicht zum Handeln: Sie muss wissen, ob lange Wartezeiten selten oder normal sind.