Summen und Durchschnitte
COUNT zählt, SUM addiert. SUM(spalte) addiert die Werte einer Spalte in allen gefundenen Zeilen, und AVG(spalte) liefert ihren Durchschnitt: die Summe geteilt durch die Anzahl der Werte. Wenn du von jedem Spiel im Shop ein Exemplar kaufen würdest, zahltest du:
SELECT SUM(preis) AS alle_spiele,
AVG(preis) AS durchschnittspreis
FROM spiele;| alle_spiele | durchschnittspreis |
|---|---|
| 570 | 28.5 |
Erinnerst du dich aus der Lektion über Funktionen, dass 7 / 2 gleich 3 ist, weil beide Zahlen ganz sind? AVG tut das nicht: Es liefert immer eine Dezimalzahl, auch wenn alle Werte ganz sind. Und ein Durchschnitt hat oft viele Nachkommastellen, du wirst ihn also meist mit ROUND runden. Das ist der Durchschnittspreis in positionen, so wie er ist und gerundet:
SELECT AVG(preis) AS durchschnitt_bezahlt,
ROUND(AVG(preis), 2) AS gerundet
FROM positionen;| durchschnitt_bezahlt | gerundet |
|---|---|
| 28.3333333333333 | 28.33 |
In den Klammern kannst du jeden Ausdruck schreiben, nicht nur eine Spalte. Die Datenbank berechnet ihn für jede Zeile und addiert dann die Ergebnisse. So findest du heraus, was Bestellungen wert sind. In positionen hat jede Zeile die Anzahl der Exemplare und den Preis eines Exemplars, eine Zeile ist also menge * preis wert. Das sind die Positionen der Bestellungen 5 und 6:
SELECT bestellung_id, spiel_id, menge, preis,
menge * preis AS positionswert
FROM positionen
WHERE bestellung_id IN (5, 6);| bestellung_id | spiel_id | menge | preis | positionswert |
|---|---|---|---|---|
| 5 | 4 | 1 | 30 | 30 |
| 5 | 20 | 1 | 35 | 35 |
| 6 | 2 | 2 | 15 | 30 |
Und das addiert ihren positionswert:
SELECT SUM(menge * preis) AS gesamt
FROM positionen
WHERE bestellung_id IN (5, 6);| gesamt |
|---|
| 95 |
Eine Summe über die ganze Tabelle positionen ist der Wert von allem, was Kunden bestellt haben. Das ist nicht ganz das, was der Shop verdient hat: Sie enthält die Positionen der zwei erstatteten Bestellungen, für die die Kunden ihr Geld zurückbekommen haben. Ob eine Bestellung erstattet wurde, steht in einer anderen Tabelle, bestellungen, und wie man Tabellen kombiniert, lernst du in der Lektion über Joins. Bis dahin enthalten die Summen in dieser Lektion die erstatteten Bestellungen, außer in der letzten Übung, wo du sie auf andere Weise weglässt.
Wie COUNT(spalte) überspringen SUM und AVG den Wert NULL, AVG teilt also durch die Anzahl der Werte, nicht der Zeilen. Und wenn es nichts zu addieren gibt, weil WHERE keine Zeile gefunden hat, liefern sie NULL, nicht 0. Wenn du dort eine 0 brauchst, benutze COALESCE(SUM(preis), 0) aus der Lektion über Funktionen.
Typischer Fehler: SUM(preis) statt SUM(menge * preis). In Bestellung 6 hat der Kunde zwei Exemplare von Pixel Racer gekauft, und SUM(preis) würde nur eines zählen.
So schreibst du es:
Anweisungen
- 1
Wie viele Exemplare von Spielen haben Kunden bestellt? Addiere die Spalte
mengevonpositionenin einer Spaltebestellte_exemplare:bestellte_exemplare 45 - 2
Berechne darunter den Wert aller bestellten Positionen: die Summe von
menge * preisin einer Spaltepositionswert:positionswert 1260 - 3
Und zeige den Durchschnittspreis der Spiele für alle Altersstufen (
altersfreigabe3), auf 2 Nachkommastellen gerundet, in einer Spaltedurchschnittspreis:durchschnittspreis 25.71