Zum Inhalt
wannacode

Die Bäckerei, Etappe 3: die Fragen

Kurz gesagt: Etappe 3 beantwortet die Fragen der Bäckerei mit JOIN, GROUP BY, LEFT JOIN, WITH und COALESCE: die Speisekarte, die Rechnungen, die Bestseller und der Umsatz pro Stadt.

Problem

Was sie wissen wollen

Die Bäckerei hat Daten. Jetzt will sie Antworten: was in die Speisekarte kommt, wie viel jeder Kunde bezahlt hat, wovon mehr gebacken werden soll, wem man einen Rabatt schickt, welche Bestellungen groß sind und woher das Geld kommt.

Jede Frage ist eine Abfrage an die Datenbank aus Etappe 2. Nichts wird geschrieben: Die Datenbank ist nach jeder Abfrage dieselbe.

Die Idee

Die günstigen Sachen

Die einfachste Frage geht an eine Tabelle: die Produkte unter 2 €, vom günstigsten aufwärts.

SQLleere Datenbank

Probier es aus

Die Speisekarte

Erstelle die Speisekarte: die Kategorie (Spalte category), den Namen und den Preis jedes Produkts. Sortiere nach Kategorie in der Reihenfolge ihrer Nummern (Brot, Teilchen, Getränke) und innerhalb der Kategorie vom günstigsten Produkt an.

SQLleere Datenbank

Die Idee

Die Rechnung

Jede Zeile der Bestellung kostet quantity * unit_price. Desislavas Bestellung 5:

SQLleere Datenbank

Die Summe der Bestellung ist die Gesamtsumme dieser Zeilen: SUM(quantity * unit_price) mit GROUP BY der Bestellung.

Probier es aus

Die Rechnungen aller

Für jede Bestellung, die nicht storniert ist: die Nummer, der Name des Kunden, das Datum und die Summe (Spalte total, auf 2 Stellen gerundet). Sortiere nach Nummer.

SQLleere Datenbank
Genauer, für Neugierige

GROUP BY o.id, während SELECT c.name und o.ordered_at hat, die nicht in der Gruppe stehen. SQLite erlaubt das. PostgreSQL akzeptiert o.ordered_at, weil der Primärschlüssel von orders in der Gruppe steht, aber nicht c.name, das aus einer anderen Tabelle kommt. Dort schreibst du GROUP BY o.id, c.name, und dann läuft die Abfrage überall.

Probier es aus

Wovon mehr gebacken werden soll

Die drei meistverkauften Produkte nach Stückzahl, ohne die stornierten Bestellungen: der Name und die Anzahl (Spalte pieces), vom meistverkauften an. Bei gleicher Stückzahl nach Namen.

SQLleere Datenbank

Die Idee

Wer noch nicht bestellt hat

LEFT JOIN behält jeden Kunden, auch ohne Bestellung. Dort sind die Spalten der Bestellung NULL, und WHERE o.id IS NULL lässt genau diese übrig:

SQLleere Datenbank

Probier es aus

Ein Rabatt für die Neuen

Die Bäckerei schickt allen einen Rabatt, die keine echte Bestellung haben: keine Bestellungen oder nur stornierte. Zeige ihre Namen in alphabetischer Reihenfolge.

SQLleere Datenbank

Probier es aus

Die großen Bestellungen

Welche Bestellungen (ohne die stornierten) liegen über der durchschnittlichen Summe pro Bestellung? Die Nummer und die Summe (total, auf 2 Stellen gerundet), nach Nummer. Bilde die Summen mit WITH totals AS (…).

SQLleere Datenbank

Übung

Woher das Geld kommt

Der Umsatz pro Stadt aus den Bestellungen, die nicht storniert sind, für alle Städte der Kunden. Eine Stadt ohne Umsatz hat 0, und die Kunden ohne Stadt stehen unter 'ohne Stadt'. Spalten city und revenue (auf 2 Stellen gerundet), vom größten Umsatz an.

SQLleere Datenbank
Genauer, für Neugierige

SUM über eine Gruppe mit nur NULL ergibt NULL, nicht 0. Darum steht dort COALESCE(SUM(…), 0). Die Summe einer Bestellung ist eine Dezimalzahl, deshalb ROUND: 0,1 + 0,2 in REAL ist nicht genau 0,3.

Die Idee

Was als Nächstes kommt

Alle diese Abfragen lesen nur. Die nächste Etappe ändert die Daten: Preise, Status, Lagerbestand, gelöschte Bestellungen.

Test

Teste dich

1. Warum addiert die Rechnung der Bestellung quantity * unit_price und nicht price aus products?
2. LEFT JOIN orders o ON o.customer_id = c.id und danach WHERE o.status <> 'cancelled'. Was passiert mit den Kunden ohne Bestellungen?
3. Der Durchschnitt pro Bestellung ist 9,40 €. Warum nicht WHERE total > 9.4 schreiben?

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