Zum Inhalt
wannacode

Aggregatfunktionen: COUNT, SUM, AVG

Kurz gesagt: Die Aggregatfunktionen COUNT, SUM, AVG, MIN und MAX reduzieren viele Zeilen auf einen einzigen Wert: eine Anzahl, eine Summe, einen Durchschnitt, den kleinsten oder den größten Wert.

Problem

Der Montagsbericht

Jeden Montag fragt der Inhaber dasselbe. Wie viele Kunden haben wir? Aus wie vielen Städten kommen sie? Wie viel Geld ist durch den Shop gelaufen? Was ist das teuerste Produkt?

Bisher lieferten Abfragen Zeilen. Hier brauchst du aus vielen Zeilen eine Zahl. Von Hand zählen geht nicht: Morgen sind es Tausende von Zeilen.

Die Idee

COUNT: wie viele

COUNT(*) zählt die Zeilen:

SQLDatenbank: Shop

Zwanzig Zeilen gehen hinein, eine Zeile kommt heraus. Eine Funktion, die viele Zeilen in einen Wert presst, heißt Aggregatfunktion.

COUNT hat noch zwei Formen. COUNT(Spalte) zählt nur die Zeilen, in denen die Spalte nicht NULL ist. COUNT(DISTINCT Spalte) zählt die verschiedenen Werte:

SQLDatenbank: Shop

20 Kunden, 19 mit Stadt (Boris hat keine) und 6 verschiedene Städte.

Probier es aus

Wie viele sind ausverkauft

Der Chef will nicht die Namen, nur die Zahl: Wie viele Produkte haben den Lagerbestand 0? Das Feld zeigt, welche. Mach daraus eine Zahl.

SQLDatenbank: Shop

Die Idee

SUM, AVG, MIN, MAX

Die anderen vier Funktionen arbeiten mit den Werten der Spalte:

  • SUM: die Summe;
  • AVG: der Durchschnitt;
  • MIN und MAX: der kleinste und der größte Wert.

Der Umsatz ist die Summe jeder Bestellposition: Menge mal Preis.

SQLDatenbank: Shop

1.963,50 €. Vorsicht: Hier sind auch die Positionen stornierter Bestellungen dabei. Welche Bestellungen storniert sind, steht in orders, die Beträge stehen in order_items. Die beiden Tabellen bringen wir im nächsten Modul mit JOIN zusammen.

Der niedrigste, der höchste und der durchschnittliche Preis der Produkte:

SQLDatenbank: Shop

MIN und MAX funktionieren auch mit Text und Datumsangaben. Die erste und die letzte Bestellung:

SQLDatenbank: Shop

Probier es aus

Die Bewertung des Kaffees

Die Kaffeebohnen (product_id = 17) haben eine schlechte Bewertung bekommen. Wie viele Bewertungen hat das Produkt, und wie lautet die Durchschnittsnote?

SQLDatenbank: Shop

Sieh es dir an

Eine Zeile, auch wenn nichts da ist

Ein Aggregat ohne Gruppen liefert immer eine Zeile. Die drei Positionen von Bestellung 8 werden zu einer:

SQLDatenbank: Shop

Und wenn keine einzige Zeile WHERE passiert? Es gibt noch keine Bewertungen aus dem Oktober 2026:

SQLDatenbank: Shop

Immer noch eine Zeile: COUNT liefert 0, und AVG liefert NULL. Es gibt nichts zu mitteln. SUM, MIN und MAX verhalten sich genauso. In einem Bericht sieht NULL wie eine leere Zelle aus, ersetze es bei Bedarf mit COALESCE(SUM(...), 0).

Sieh es dir an

AVG überspringt NULL

Wie COUNT(Spalte) überspringen auch SUM, AVG, MIN und MAX NULL. Bei AVG verändert das das Ergebnis: Du teilst nicht durch alle Zeilen, sondern durch die, die einen Wert haben.

Wie hoch ist der durchschnittliche Lagerbestand? Und der durchschnittliche Lagerbestand der Produkte, die wir wirklich haben? NULLIF(stock, 0) macht aus den Nullen NULL:

SQLDatenbank: Shop
1. Der durchschnittliche Lagerbestand kam auf 73,84, und ohne die ausverkauften Produkte auf 80,26. Warum ist die zweite Zahl größer?

Wenn du AVG über eine Spalte mit NULL schreibst, frag dich: Sollen die leeren als null zählen? Wenn ja, AVG(COALESCE(Spalte, 0)). Wenn nicht, macht AVG(Spalte) es schon.

Übung

Zwei Berichte

1. Der Kaffeelieferant fragt, wie viele Packungen Kaffeebohnen (product_id = 17) wir verkauft haben und für wie viel Geld.

Die Stückzahl und das Geld für die Kaffeebohnen:

SQLDatenbank: Shop

2. Wie viele Bestellungen wurden zugestellt, und an wie viele verschiedene Kunden?

Die zugestellten Bestellungen und die verschiedenen Kunden darin:

SQLDatenbank: Shop

Test

Teste dich

1. Die Tabelle hat 20 Kunden, und einer davon hat keine Stadt. Was liefert COUNT(city)?
2. Wie viele Zeilen liefert SELECT SUM(quantity) FROM order_items WHERE order_id = 8?
3. Was liefert SUM über null Zeilen?
4. Wie berechnest du den Umsatz aus allen Bestellpositionen?

Erstellt von Ivo Gergov im Rahmen der Kampagne von Evo Tech für zugängliche Programmierausbildung ·