Datenbanken und betriebliche Datenmodelle – Gruppierungen und Kennzahlen berechnen
Datenbanken und betriebliche Datenmodelle – Gruppierungen und Kennzahlen berechnen
Zielgruppe: Auszubildende in kaufmännischen und IT-Berufen
Kurzbeschreibung: Aggregation und Bezugsgröße – betriebliche Daten mit SQL gruppieren und aussagekräftige Kennzahlen berechnen.
Lernzeit: ca. 60–90 Minuten
Voraussetzungen: Grundkenntnisse zu Tabellen und einfachen SQL-Abfragen.
Lernform: Fünf kurze Lerneinheiten, ein fiktiver Ausbildungsfall, lokale SQL-Experimente, interaktive Übungen und Transferaufgaben.

Einleitung
Wie viele Artikel wurden verkauft? Welche Warengruppe erzielt den höchsten Umsatz? Und was bedeutet der durchschnittliche Umsatz pro Auftrag?
In diesem aiMOOC lernst Du, wie Du mit SQL Daten gruppierst, Kennzahlen berechnest und die passende Bezugsgröße auswählst.
Deine Lernziele
Nach dem Kurs kannst Du:
- Datenmodelle mit Primär- und Fremdschlüsseln verstehen.
- Aggregationen mit SUM, COUNT und AVG berechnen.
- Mit GROUP BY und HAVING betriebliche Auswertungen erstellen.
- Den Unterschied zwischen Stückzahl, Auftragszahl und Umsatz erklären.
- Kennzahlen prüfen, visualisieren und für betriebliche Entscheidungen nutzen.
Lernpfad
| Lerneinheit | Thema | Zeit |
|---|---|---|
| Einstieg | Betriebliche Daten verstehen | 8 Minuten |
| Basis | Aggregation und Kennzahlen | 10 Minuten |
| Anwendung | Daten gruppieren | 12 Minuten |
| Vertiefung | Bezugsgrößen richtig wählen | 12 Minuten |
| Transfer | Ergebnisse prüfen und bewerten | 10 Minuten |
Die übrige Zeit nutzt Du für die interaktiven Übungen und den Lernnachweis.
Ausbildungsfall: Fahrradhandel Nordstern
Du arbeitest im fiktiven Fahrradhandel Nordstern. Deine Ausbilderin benötigt eine Auswertung der Verkäufe eines Beispieltages.
Die Daten bestehen ausschließlich aus erfundenen Artikeln und Aufträgen.
Dein Arbeitsauftrag: Berechne Stückzahlen, Umsätze und durchschnittliche Umsätze pro Auftrag.
Lerneinheit 1: Das betriebliche Datenmodell
Eine Relationale Datenbank speichert Informationen in Tabellen. Ein Primärschlüssel identifiziert einen Datensatz eindeutig. Ein Fremdschlüssel stellt die Beziehung zu einer anderen Tabelle her.

Abbildung: Grundbegriffe einer relationalen Tabelle.

Abbildung: Beispiel eines Entity-Relationship-Modells aus einem anderen Anwendungsbereich.
Unser vereinfachtes Betriebsmodell:
| Tabelle | Wichtige Felder | Bedeutung |
|---|---|---|
| artikel | artikel_id, name, warengruppe | Artikelstammdaten |
| position | positions_id, auftrag_id, artikel_id, menge, einzelpreis_cent | Verkaufspositionen |
Beziehung: position.artikel_id verweist auf artikel.artikel_id. Ein Artikel kann in mehreren Verkaufspositionen erscheinen.
Die Auftragsnummer wird im vereinfachten Modell direkt in der Position gespeichert. Eine separate Auftragstabelle ist nicht Bestandteil dieser Übung.
Beispieldaten
| Auftrag | Artikel | Warengruppe | Menge | Einzelpreis netto | Positionsumsatz |
|---|---|---|---|---|---|
| 1001 | Helm | Schutz | 2 | 30 € | 60 € |
| 1001 | Licht | Zubehör | 1 | 20 € | 20 € |
| 1002 | Schloss | Zubehör | 3 | 15 € | 45 € |
| 1002 | Helm | Schutz | 1 | 30 € | 30 € |
| 1003 | Licht | Zubehör | 2 | 20 € | 40 € |
| 1004 | Weste | Schutz | 4 | 10 € | 40 € |
| 1004 | Schloss | Zubehör | 1 | 15 € | 15 € |
| 1005 | Helm | Schutz | 1 | 30 € | 30 € |
Kontrolle: Acht Verkaufspositionen, fünf unterschiedliche Aufträge, 15 verkaufte Stück und 280 € Nettoumsatz.
Alle Preise sind fiktive Nettopreise. Rabatte, Retouren und Umsatzsteuer bleiben in diesem Übungsmodell unberücksichtigt.
Mini-Aufgabe: Eine Tabellenzeile verstehen
Erkläre, weshalb der Auftrag 1001 zweimal vorkommt, obwohl er nur ein Auftrag ist.
Feedback: Ein Auftrag kann mehrere Positionen enthalten. Deshalb entspricht die Anzahl der Tabellenzeilen nicht automatisch der Anzahl der Aufträge.
Lerneinheit 2: Aggregation und Kennzahlen
Aggregation bedeutet, mehrere Werte zu einer zusammenfassenden Größe zu verdichten.
| SQL-Funktion | Bedeutung | Beispiel |
|---|---|---|
| SUM | Summe | Verkaufte Stück |
| COUNT | Anzahl | Verkaufspositionen |
| AVG | Arithmetischer Mittelwert | Durchschnittspreis je Position |
| MIN | Kleinster Wert | Niedrigster Preis |
| MAX | Größter Wert | Höchster Preis |
Merke: Jede Kennzahl braucht eine eindeutige fachliche Definition.
SQL-Beispiel: Positionen und Stückzahlen
SELECT
COUNT(*) AS positionen,
SUM(menge) AS stueck
FROM position;
Ergebnis:
| Positionen | Stück |
|---|---|
| 8 | 15 |
COUNT(*) zählt Zeilen. SUM(menge) addiert die verkauften Mengen.
Mini-Aufgabe: Unterschied erklären
Warum liefert COUNT(*) den Wert 8, während SUM(menge) den Wert 15 liefert?
Feedback: Die Zeilenzahl und die Anzahl verkaufter Einheiten sind unterschiedliche Bezugsgrößen.
Lerneinheit 3: Mit GROUP BY gruppieren
Mit GROUP BY fasst Du Datensätze zusammen, die denselben Wert eines Gruppierungsmerkmals haben.
SELECT
a.warengruppe,
SUM(p.menge) AS stueck
FROM position AS p
JOIN artikel AS a
ON p.artikel_id = a.artikel_id
GROUP BY a.warengruppe
ORDER BY a.warengruppe;
Ergebnis:
| Warengruppe | Verkauft |
|---|---|
| Schutz | 8 Stück |
| Zubehör | 7 Stück |
Warum JOIN? Die Warengruppe steht in der Artikeltabelle, die verkaufte Menge in der Positionstabelle. Der JOIN verknüpft beide Tabellen über die Artikel-ID.
Video: InformatikVideos – Group By und Having, SQL-Tutorial mit Beispielen.
Mini-Aufgabe: Gruppierung verändern
Ersetze gedanklich GROUP BY a.warengruppe durch GROUP BY p.auftrag_id.
Welche Art von Ergebnis entsteht?
Feedback: Du erhältst eine Auswertung pro Auftrag statt pro Warengruppe. Die Gruppierung bestimmt die fachliche Perspektive.
Lerneinheit 4: Bezugsgrößen richtig wählen
Eine Bezugsgröße beschreibt, worauf sich eine Kennzahl bezieht.
Die gleiche Umsatzsumme kann beispielsweise auf Aufträge, Positionen oder verkaufte Stück bezogen werden. Dadurch entstehen unterschiedliche Kennzahlen.
Beispiel: Umsatz und Aufträge
| Warengruppe | Stück | Nettoumsatz | Unterschiedliche Aufträge | Umsatz je beteiligtem Auftrag |
|---|---|---|---|---|
| Schutz | 8 | 160 € | 4 | 40 € |
| Zubehör | 7 | 120 € | 4 | 30 € |
Formel:
Umsatz je beteiligtem Auftrag einer Warengruppe = Umsatz dieser Warengruppe / Anzahl unterschiedlicher Aufträge mit mindestens einer Position dieser Warengruppe.
Schutz: 160 € / 4 = 40 €.
Zubehör: 120 € / 4 = 30 €.
Beide Warengruppen kommen teilweise in denselben Aufträgen vor. Deshalb ergeben vier plus vier Warengruppen-Auftragszuordnungen nicht acht unterschiedliche Aufträge im Gesamtbetrieb.
Visualisierung: Umsatz nach Warengruppe
| Warengruppe | Balken | Nettoumsatz |
|---|---|---|
| Schutz | ████████ | 160 € |
| Zubehör | ██████ | 120 € |
Maßstab: Ein Block entspricht 20 €.

Abbildung: Allgemeines Beispiel eines Balkendiagramms. Die tatsächlich berechneten Nordstern-Werte stehen in der Tabelle darüber.
Die richtige Kennzahl auswählen
| Frage | Zähler | Nenner | Ergebnis |
|---|---|---|---|
| Umsatz je Auftrag insgesamt | 280 € | 5 Aufträge | 56 € |
| Umsatz je Verkaufsposition | 280 € | 8 Positionen | 35 € |
| Umsatz je verkauftem Stück | 280 € | 15 Stück | ca. 18,67 € |
Achtung: AVG(einzelpreis_cent) würde in diesem Beispiel 21,25 € ergeben. Das ist der ungewichtete Durchschnitt der acht gespeicherten Positions-Einzelpreise, nicht der Umsatz je verkauftem Stück.

Abbildung: Ein allgemeiner Vergleich von Kreis- und Balkendiagramm. Überlege, welche Darstellungsform für zwei Umsatzwerte leichter abzulesen ist. Das Bild zeigt nicht die Nordstern-Daten.
Mini-Aufgabe: Warum verschiedene Durchschnitte?
Erkläre, warum 56 €, 35 € und 18,67 € gleichzeitig richtig sein können.
Feedback: Der Zähler ist identisch, aber der Nenner verändert sich. Jede Kennzahl beantwortet eine andere Frage.
Lerneinheit 5: Daten filtern und Ergebnisse prüfen
WHERE filtert einzelne Zeilen vor der Gruppierung.
HAVING filtert Gruppen nach der Aggregation.
Beispiel: Zeige nur Aufträge mit mindestens 60 € Nettoumsatz.
SELECT
auftrag_id,
SUM(menge * einzelpreis_cent) / 100.0
AS umsatz_eur
FROM position
GROUP BY auftrag_id
HAVING SUM(menge * einzelpreis_cent) >= 6000
ORDER BY auftrag_id;
Ergebnis:
| Auftrag | Nettoumsatz |
|---|---|
| 1001 | 80 € |
| 1002 | 75 € |
Die Preise werden in ganzen Cent gespeichert. Die Division durch 100.0 dient hier der Ausgabe in Euro.
Video: Patrick Boekhoven – GROUP BY, HAVING und Aggregatfunktionen in SQL.
Typische Fehler erkennen
| Fehler | Warum problematisch? | Verbesserung |
|---|---|---|
| COUNT(*) als Stückzahl | Positionen sind nicht Stück | SUM(menge) |
| COUNT(*) als Auftragszahl | Aufträge können mehrfach vorkommen | COUNT(DISTINCT auftrag_id) |
| AVG(Einzelpreis) als Stückdurchschnitt | Mengen werden nicht berücksichtigt | Gesamtumsatz / Gesamtstückzahl |
| HAVING durch WHERE ersetzen | Die Bedingung bezieht sich auf Gruppenergebnisse | HAVING für Aggregatfilter |
| Auftragszahlen der Warengruppen addieren | Ein Auftrag kann mehreren Gruppen angehören | Aufträge insgesamt separat zählen |
Hinweis zu fehlenden Werten: COUNT(*) zählt auch Zeilen mit NULL-Werten. COUNT(spalte), SUM(spalte) und AVG(spalte) ignorieren NULL in ihrem jeweiligen Argument. SUM und AVG können bei fehlenden gültigen Eingabewerten NULL liefern.
Lokales SQL-Labor: Isolierte Testumgebung
Sicherheit: Alle Experimente nutzen Python und SQLite ausschließlich lokal mit erfundenen Daten. Die Datenbank wird im Arbeitsspeicher erzeugt und nach dem Programmende verworfen. Es sind weder Internetverbindung noch Serverzugänge, Kundendaten oder eine Produktivdatenbank erforderlich.
Du benötigst eine lokale Python-3-Installation mit dem Standardmodul sqlite3.
Durchführung: Speichere den folgenden vollständigen Code als lernlabor.py und starte ihn lokal mit python lernlabor.py beziehungsweise python3 lernlabor.py.
Testprinzip: Aufgabe A enthält eine funktionierende Musterabfrage. Ersetze bei B und C jeweils die Zeichenfolge SELECT 'noch offen' durch Deine eigene SQL-Abfrage. Nach jedem Start erhältst Du automatisch Feedback.
import sqlite3
db = sqlite3.connect(":memory:")
db.execute("PRAGMA foreign_keys = ON")
db.executescript("""
CREATE TABLE artikel (
artikel_id INTEGER PRIMARY KEY,
name TEXT NOT NULL,
warengruppe TEXT NOT NULL
);
CREATE TABLE position (
positions_id INTEGER PRIMARY KEY,
auftrag_id INTEGER NOT NULL,
artikel_id INTEGER NOT NULL
REFERENCES artikel(artikel_id),
menge INTEGER NOT NULL CHECK (menge > 0),
einzelpreis_cent INTEGER NOT NULL
CHECK (einzelpreis_cent >= 0)
);
INSERT INTO artikel VALUES
(1, 'Helm', 'Schutz'),
(2, 'Licht', 'Zubehör'),
(3, 'Schloss', 'Zubehör'),
(4, 'Weste', 'Schutz');
INSERT INTO position VALUES
(1, 1001, 1, 2, 3000),
(2, 1001, 2, 1, 2000),
(3, 1002, 3, 3, 1500),
(4, 1002, 1, 1, 3000),
(5, 1003, 2, 2, 2000),
(6, 1004, 4, 4, 1000),
(7, 1004, 3, 1, 1500),
(8, 1005, 1, 1, 3000);
""")
# A: Funktionierendes Basisbeispiel
SQL_A = """
SELECT a.warengruppe, SUM(p.menge)
FROM position AS p
JOIN artikel AS a
ON a.artikel_id = p.artikel_id
GROUP BY a.warengruppe
ORDER BY a.warengruppe;
"""
# B: Nettoumsatz in Euro je Warengruppe
SQL_B = "SELECT 'noch offen'"
# C: Umsatz je beteiligtem Auftrag und Warengruppe
SQL_C = "SELECT 'noch offen'"
tests = [
(
"A: Stück je Warengruppe",
SQL_A,
[("Schutz", 8), ("Zubehör", 7)],
"SUM(menge) addiert die verkauften Stück."
),
(
"B: Nettoumsatz je Warengruppe",
SQL_B,
[("Schutz", 160.0), ("Zubehör", 120.0)],
"Berechne SUM(menge * einzelpreis_cent)"
" und teile durch 100.0."
),
(
"C: Euro je beteiligtem Auftrag",
SQL_C,
[("Schutz", 40.0), ("Zubehör", 30.0)],
"Teile den Gruppenumsatz durch"
" COUNT(DISTINCT auftrag_id)."
)
]
for titel, abfrage, erwartet, erklaerung in tests:
print("\n" + titel)
try:
ergebnis = db.execute(abfrage).fetchall()
if ergebnis == erwartet:
print("BESTANDEN:", ergebnis)
print("Begründung:", erklaerung)
else:
print("NOCH NICHT BESTANDEN")
print("Dein Ergebnis:", ergebnis)
print("Erwartet:", erwartet)
print("Hinweis:", erklaerung)
except sqlite3.Error as fehler:
print("SQL-Fehler:", fehler)
print("Hinweis:", erklaerung)
db.close()
Wichtig: Die Aufgaben B und C sind zunächst absichtlich unvollständig. Das Programm selbst ist ausführbar und meldet entsprechend, welche Tests Du noch lösen musst. Die Ergebnistabellen sind für das Training fest vorgegeben.
Gestufte Hilfen für das Labor
| Aufgabe | Hilfe 1: Denkimpuls | Hilfe 2: SQL-Struktur | Hilfe 3: Rechenweg |
|---|---|---|---|
| A – Basis | Was wird gezählt? | GROUP BY warengruppe | Stück mit SUM(menge) addieren |
| B – Anwendung | Welche Angaben ergeben den Umsatz? | JOIN, SUM, GROUP BY | Menge mal Preis in Cent, anschließend durch 100.0 teilen |
| C – Transfer | Auf wie viele unterschiedliche Aufträge bezieht sich der Umsatz? | COUNT(DISTINCT auftrag_id) | Umsatz der Gruppe geteilt durch ihre Anzahl beteiligter Aufträge |
Arbeitsregel: Nutze zunächst Hilfe 1. Wenn Du nicht weiterkommst, verwende Hilfe 2 und anschließend Hilfe 3.
Interaktive Aufgaben
Quiz: Teste Dein Wissen
Was kennzeichnet einen Primärschlüssel? (Er identifiziert jeden Datensatz der Tabelle eindeutig) (!Er speichert immer den Gesamtumsatz) (!Er verbindet automatisch alle Datenbanken) (!Er enthält ausschließlich Preise)
Welche SQL-Funktion addiert numerische Werte? (SUM) (!COUNT) (!MIN) (!DISTINCT)
Wie viele Verkaufspositionen enthält der Ausbildungsfall? (8) (!5) (!15) (!4)
Wie werden Daten nach einer gemeinsamen Warengruppe zusammengefasst? (Mit GROUP BY) (!Mit ORDER BY allein) (!Mit DELETE) (!Mit INSERT)
Wie hoch ist der Nettoumsatz der Warengruppe Schutz? (160 Euro) (!120 Euro) (!280 Euro) (!40 Euro)
Welche Bezugsgröße benötigst Du für den durchschnittlichen Umsatz je Auftrag insgesamt? (Die Anzahl unterschiedlicher Aufträge) (!Die Anzahl der Warengruppen) (!Die Anzahl der Artikelarten) (!Die Anzahl der Datenbankspalten)
Warum darfst Du die Auftragszahlen der beiden Warengruppen nicht einfach addieren? (Ein Auftrag kann Artikel aus beiden Warengruppen enthalten) (!Jeder Auftrag gehört immer nur zu einer Warengruppe) (!SQL kann keine Aufträge zählen) (!Die Preise werden in Cent gespeichert)
Welche SQL-Klausel filtert Gruppen anhand einer berechneten Summe? (HAVING) (!WHERE allein) (!JOIN) (!FROM)
Was zählt COUNT mit einer bestimmten Spalte als Argument? (Die Werte dieser Spalte, die nicht NULL sind) (!Nur doppelt vorkommende Werte) (!Immer sämtliche Zeilen unabhängig vom Spalteninhalt) (!Ausschließlich die größten Werte)
Wie hoch ist der durchschnittliche Nettoumsatz je Auftrag des Gesamtbetriebs? (56 Euro) (!35 Euro) (!40 Euro) (!18 Euro)
Memory
Ordne die Begriffe ihren passenden Erklärungen zu.
| Primärschlüssel | Eindeutige Kennung eines Datensatzes |
| Fremdschlüssel | Verweis auf einen Schlüssel in einer anderen Tabelle |
| Aggregation | Rechnerische Zusammenfassung mehrerer Werte |
| GROUP BY | Zusammenfassung nach einem gemeinsamen Merkmal |
| SUM | Addition numerischer Werte |
| Bezugsgröße | Grundlage, auf die sich eine Kennzahl bezieht |
| HAVING | Filter für bereits gebildete Gruppen |
Drag and Drop
Ordne die SQL-Begriffe ihren Funktionen zu.
| Ordne die richtigen Begriffe zu. | Bedeutung |
|---|---|
| COUNT | Datensätze zählen |
| AVG | Arithmetischen Mittelwert berechnen |
| JOIN | Zusammengehörige Tabellenzeilen verknüpfen |
| WHERE | Zeilen vor der Gruppierung filtern |
| GROUP BY | Zeilen nach einem Merkmal gruppieren |
| HAVING | Gruppen anhand einer Bedingung filtern |
Kreuzworträtsel
| AGGREGATION | Wie heißt die rechnerische Zusammenfassung mehrerer Datenwerte? |
| GRUPPIERUNG | Wie nennt man die Zusammenfassung von Datensätzen anhand gemeinsamer Merkmale? |
| AUFTRAG | Welche betriebliche Einheit kann mehrere Verkaufspositionen enthalten? |
| UMSATZ | Welche Kennzahl beschreibt den Wert der Verkäufe? |
| MITTELWERT | Wie heißt ein rechnerischer Durchschnitt? |
| FREMDSCHLUESSEL | Welcher Schlüssel verweist auf eine andere Tabelle? Schreibe Umlaute als ae, oe oder ue und ß als ss. |
LearningApps
Hinweis: Der Suchrahmen kann externe Lernangebote anzeigen. Verwende für SQL-Versuche ausschließlich das lokale Labor. Übertrage keine betrieblichen oder personenbezogenen Daten an externe Dienste.
Lückentext
Offene Aufgaben
Bearbeite die Aufgaben möglichst mit dem fiktiven Nordstern-Datenmodell. Halte Deine SQL-Abfragen, Ergebnisse und Erklärungen fest.
Leicht – Basisaufgaben
- Datenmodell: Zeichne zwei Tabellen für Artikel und Verkaufspositionen. Markiere Primär- und Fremdschlüssel.
- SQL: Berechne den Positionsumsatz des ersten Datensatzes und erkläre Deinen Rechenweg.
- Aggregation: Ermittle die Gesamtstückzahl und die Anzahl der Verkaufspositionen. Vergleiche beide Werte.
- Datenvisualisierung: Gestalte ein einfaches Balkendiagramm mit den Stückzahlen der beiden Warengruppen.
Standard – Anwendungsaufgaben
- GROUP BY: Schreibe eine SQL-Abfrage, die die verkaufte Menge pro Warengruppe berechnet.
- Umsatz: Entwickle eine SQL-Abfrage für den Nettoumsatz pro Warengruppe und überprüfe sie im lokalen Labor.
- HAVING: Erstelle eine Liste aller Aufträge mit mindestens 60 € Nettoumsatz und erkläre die Filterung.
- Kennzahl: Erstelle ein kleines Dashboard mit Gesamtumsatz, Auftragszahl und durchschnittlichem Umsatz je Auftrag.
Schwer – Transferaufgaben
- Bezugsgröße: Untersuche, weshalb der Umsatz je Position und der Umsatz je Auftrag unterschiedliche Werte liefern. Formuliere passende betriebliche Fragestellungen.
- Datenqualität: Ergänze im lokalen Modell einen neuen Artikel ohne Verkaufsposition. Untersuche, warum ein INNER JOIN diesen Artikel in einer Verkaufsauswertung nicht anzeigt, und entwickle eine Lösung mit LEFT JOIN.
- Datenanalyse: Prüfe, warum die Summe der unterschiedlichen Auftragszahlen pro Warengruppe nicht der Anzahl unterschiedlicher Aufträge im Gesamtbetrieb entspricht.
- Betriebliche Entscheidung: Verfasse einen kurzen Bericht für die Ausbilderin. Empfiehl eine Maßnahme auf Grundlage der Kennzahlen und erläutere, welche zusätzlichen Daten für eine belastbare Entscheidung fehlen.


Lösungen und begründetes Feedback
Basis: Stückzahl je Warengruppe
Erwartete Ergebnisse: Schutz 8 Stück, Zubehör 7 Stück.
Begründung: Die verkauften Mengen müssen addiert werden. COUNT(*) liefert dagegen nur die Zahl der Verkaufspositionen.
Anwendung: Nettoumsatz je Warengruppe
Eine mögliche Lösung für SQL_B:
SELECT
a.warengruppe,
SUM(p.menge * p.einzelpreis_cent) / 100.0
AS umsatz_eur
FROM position AS p
JOIN artikel AS a
ON a.artikel_id = p.artikel_id
GROUP BY a.warengruppe
ORDER BY a.warengruppe;
Erwartete Ergebnisse: Schutz 160 €, Zubehör 120 €.
Begründung: Der Umsatz einer Verkaufsposition ergibt sich aus Menge mal Nettoeinzelpreis. Erst danach werden die Positionsumsätze innerhalb der Warengruppe addiert.
Transfer: Umsatz je beteiligtem Auftrag
Eine mögliche Lösung für SQL_C:
SELECT
a.warengruppe,
ROUND(
SUM(p.menge * p.einzelpreis_cent)
/ (100.0 * COUNT(DISTINCT p.auftrag_id)),
2
) AS euro_je_auftrag
FROM position AS p
JOIN artikel AS a
ON a.artikel_id = p.artikel_id
GROUP BY a.warengruppe
ORDER BY a.warengruppe;
Erwartete Ergebnisse: Schutz 40 €, Zubehör 30 €.
Begründung: Jeder Auftrag wird innerhalb der jeweiligen Warengruppe nur einmal gezählt. Die Kennzahl misst den Umsatz dieser Gruppe pro Auftrag, der mindestens eine Position dieser Gruppe enthält.
Grenze der Kennzahl: Ein Auftrag, der mehrere Warengruppen enthält, geht in jede betroffene Gruppe ein. Deshalb sind die gruppierten Auftragszahlen nicht additiv.
Zusatztest: Welche Bezugsgröße passt?
Situation: Die Geschäftsleitung möchte wissen, wie viel Umsatz durchschnittlich mit einer verkauften Einheit erzielt wird.
Richtige Rechnung: 280 € / 15 Stück = rund 18,67 € je Stück.
Nicht passend: 280 € / 5 Aufträge = 56 € je Auftrag.
Feedback: Beide Rechnungen sind korrekt. Nur die erste beantwortet jedoch die gestellte Frage nach einer verkauften Einheit.
Lernkontrolle
Bearbeite diese Aufgaben ohne direkte Übernahme der Musterlösungen.
- SQL-Abfrage: Ein Betrieb verkauft viele Einheiten je Auftragsposition. Erkläre anhand eines selbst erfundenen Beispiels, warum COUNT(*) keine korrekte Stückzahl ergibt.
- Datenmodellierung: Ein Unternehmen möchte auch Aufträge ohne Positionen auswerten. Begründe, weshalb dafür eine eigene Auftragstabelle sinnvoll ist, und skizziere die Tabellenbeziehungen.
- Kennzahl: Ein Dashboard zeigt nur einen durchschnittlichen Umsatzwert. Beschreibe, welche Angaben Du zusätzlich benötigst, damit die Kennzahl fachlich eindeutig ist.
- Datenqualität: Erkläre, wie doppelt gespeicherte Verkaufspositionen eine Umsatzkennzahl verfälschen können. Entwickle einen geeigneten Plausibilitätstest.
- Aggregation: Zwei Filialen erzielen denselben Umsatz, verkaufen jedoch unterschiedlich viele Stück. Interpretiere die Unterschiede des Umsatzes je Stück.
- Transfer: Eine Geschäftsleitung will aus den Warengruppenumsätzen auf den Gewinn schließen. Begründe, warum die vorhandenen Daten dafür nicht ausreichen.
- SQL: Entwickle eine zusätzliche Auswertung nach Aufträgen oder Artikeln und erkläre, welchen betrieblichen Nutzen sie hat.
Lernnachweis
Für einen erfolgreichen Lernnachweis erstellst Du einen kurzen, nachvollziehbaren Ausbildungsbericht oder ein digitales Portfolio.
Dein Lernnachweis enthält:
- Datenmodell: Darstellung der Tabellen, ihrer Schlüssel und Beziehungen.
- SQL-Abfragen: Mindestens drei funktionierende Abfragen mit Aggregation und Gruppierung.
- Bezugsgrößen: Begründete Auswahl der passenden Nenner für mindestens zwei Kennzahlen.
- Ergebniskontrolle: Vergleich Deiner Resultate mit den bekannten Beispieldaten.
- Visualisierung: Mindestens ein selbst gestaltetes Diagramm mit Achsen- oder Einheitenerklärung.
- Transfer: Bewertung einer betrieblichen Entscheidung anhand der berechneten Kennzahlen.
- Reflexion: Beschreibung eines möglichen Auswertungsfehlers und einer geeigneten Gegenmaßnahme.
Bewertungskriterien: Fachliche Richtigkeit, ausführbare SQL-Abfragen, nachvollziehbare Rechenwege, passende Bezugsgrößen, verständliche Darstellung und begründete Interpretation.
Sicherheitsnachweis: Bestätige, dass Du nur lokale beziehungsweise ausdrücklich freigegebene Testdaten und Testumgebungen verwendet hast.
OERs zum Thema
Wikipedia: SQL
Weitere fachliche Quellen
- SQLite: SELECT – Offizielle Dokumentation zu GROUP BY, HAVING und der Auswertung von SELECT-Abfragen.
- SQLite: Built-in Aggregate Functions – Offizielle Dokumentation zu SUM, COUNT, AVG, MIN und MAX.
- SQLite: Foreign Key Support – Dokumentation der Fremdschlüssel und ihrer Aktivierung.
- Python-Dokumentation: sqlite3 – Lokale SQLite-Datenbanken einschließlich Datenbanken im Arbeitsspeicher.
- Relationale Datenbank – Grundlagen relationaler Datenmodelle.
- Aggregatfunktion – Grundlagen der Datenaggregation.
Mediennachweise und Nutzungsrechte
Die folgenden Wikimedia-Commons-Dateien wurden anhand ihrer Beschreibungs- und Lizenzseiten ausgewählt. Die Abbildungen zeigen allgemeine Fachkonzepte, nicht die fiktiven Nordstern-Daten.
- Sql data base with logo.svg – alaa kaddour, CC BY-SA 4.0, unverändert eingebunden.
- Grundbegriffe relationaler Datenbanken.svg – Pawiki, gemeinfrei.
- Entity-Relationship-Modell.svg – Fleshgrinder, gemeinfrei.
- Bar chart.svg – Cuvwb, CC BY-SA 4.0, unverändert eingebunden.
- Piechart.svg – Schutz, gemeinfrei.
- Group By und Having – InformatikVideos, YouTube.
- GROUP BY und HAVING – Patrick Boekhoven, YouTube.
Rechtehinweis: Die Commons-Dateien besitzen die jeweils angegebenen freien Lizenzen oder Gemeinfreiheitskennzeichnungen. Für YouTube-Videos wird damit keine freie Nachnutzungslizenz behauptet; sie werden lediglich als externe Lernmedien eingebunden. Bei externen Medien können Verbindungsdaten an Drittanbieter übertragen werden. Für praktische SQL-Tests ist ausschließlich das lokale Labor vorgesehen.
Verknüpfte Lernbereiche
aiMOOC-Projekte
Schulfach+


aiMOOCs


aiMOOC Projekte


NEWSLernweltNOAH fragen