Q2 Datenbanken

Übung 7: Nordwind-Datenbank

Lösung geprüft

Die Aufgabe der heutigen Stunde ist die siebte Übung – vermischte Aufgaben zur Nordwind-Datenbank! Hier kommt nichts Neues mehr dazu, es geht darum, alles aus den sechs Lektionen zusammen zu benutzen. Genau so sieht auch die Klausur aus.

Die Aufgabenstellung lautet

a) Bearbeiten Sie die Übung 7

Zusatzaufgabe: Erstellen Sie eine Datenbank-Anfrage zur Beantwortung der folgenden Frage: Welche Kategorie hat den meisten Umsatz erzielt?

Die Übung 7 selbst liegt auf der Tutorial-Seite und ist im OneNote nicht abgedruckt. Ausgeschrieben ist dort nur die Zusatzaufgabe – die steht hier gelöst.

Die Zusatzaufgabe

Die Nordwind-Datenbank ist im OneNote nicht abgedruckt. Sie ist aber eine Standard-Beispieldatenbank; ich rechne mit den üblichen Tabellen kategorien, artikel und bestelldetails. Heißen sie bei euch anders, tausch nur die Namen aus.
SQL
/* meininfokurs.cmrg.site */
-- Welche Kategorie hat den meisten Umsatz erzielt?
-- @meininfokurs.cmrg.site

SELECT   k.kategoriename,
         SUM(bd.einzelpreis * bd.anzahl) AS Umsatz
FROM     kategorien       AS k
INNER JOIN artikel        AS a  ON k.kategorie_id = a.kategorie_id
INNER JOIN bestelldetails AS bd ON a.artikel_id   = bd.artikel_id
GROUP BY k.kategorie_id, k.kategoriename
ORDER BY Umsatz DESC
LIMIT 1;

Wie man auf so eine Abfrage kommt

Nicht von vorne anfangen zu tippen, sondern die Frage zerlegen:

  1. Was will ich sehen? Den Kategorienamen und einen Umsatz → das kommt ins SELECT.
  2. Wo stehen diese Daten? Der Name in kategorien, die Preise in bestelldetails. Dazwischen liegt artikel → zwei JOINs.
  3. Was ist „Umsatz"? Einzelpreis mal Anzahl, über alle Positionen aufsummiert → SUM(einzelpreis * anzahl).
  4. Pro was? Pro Kategorie → GROUP BY.
  5. „Den meisten"? Absteigend sortieren und den ersten nehmen → ORDER BY … DESC LIMIT 1.

Die dritte Zeile ist die, die man am ehesten falsch macht. „Umsatz" ist keine Spalte, die irgendwo steht – man muss sie ausrechnen. Und zwar innerhalb von SUM, nicht außerhalb:

SUM(bd.einzelpreis * bd.anzahl)   -- richtig: pro Zeile rechnen, dann addieren
SUM(bd.einzelpreis) * SUM(bd.anzahl)  -- FALSCH: ergibt voellig andere Zahlen

Die zweite Variante multipliziert die Summe aller Preise mit der Summe aller Stückzahlen. Das ist eine Zahl ohne jede Bedeutung – und sie sieht auf den ersten Blick trotzdem plausibel aus.

Warum die Kategorie-ID mit ins GROUP BY gehört

GROUP BY k.kategorie_id, k.kategoriename – warum beides? Weil es theoretisch zwei Kategorien mit demselben Namen geben könnte. Gruppiert man nur nach dem Namen, würden deren Umsätze zusammengerechnet. Die ID ist der Primärschlüssel und damit garantiert eindeutig.

Wenn man alle Kategorien sehen will

-- Dasselbe ohne LIMIT: die vollstaendige Rangliste
SELECT   k.kategoriename,
         SUM(bd.einzelpreis * bd.anzahl) AS Umsatz
FROM     kategorien       AS k
INNER JOIN artikel        AS a  ON k.kategorie_id = a.kategorie_id
INNER JOIN bestelldetails AS bd ON a.artikel_id   = bd.artikel_id
GROUP BY k.kategorie_id, k.kategoriename
ORDER BY Umsatz DESC;

Das ist meistens die bessere Abfrage: man sieht nicht nur den Sieger, sondern auch, wie deutlich der Abstand ist. Und wenn zwei Kategorien gleichauf liegen, würde LIMIT 1 eine davon willkürlich unterschlagen.

Was in Übung 7 zusammenkommt

Der Rückblick im OneNote listet genau auf, was aus welcher Lektion gebraucht wird:

LektionInhalt
1WHERE, BETWEEN, LIKE, DISTINCT, ORDER BY, LIMIT
2SUM, COUNT, AVG, MAX, MIN
3INNER JOIN … ON
4GROUP BY, HAVING
5geschachtelte SELECT mit IN
6INSERT, UPDATE, DELETE, CREATE TABLE

Die Zusatzaufgabe allein benutzt Bausteine aus vier dieser sechs Lektionen. Wenn du die hinbekommst, hast du den SQL-Teil verstanden.

Aufgabe suchen

Tippe los. Strg+K öffnet die Suche von überall.

Zuletzt angesehen

Werbung