Lernpfad
Wenn du schon mit Datenbanken gearbeitet hast, ist dir sicher aufgefallen, dass Daten selten perfekt sind und oft manipuliert werden müssen, um aussagekräftige Erkenntnisse zu gewinnen.
Um diesem Bedarf gerecht zu werden, bietet SQL ein leistungsfähiges Konstrukt, die so genannte CASE-Anweisung, mit der du neue Spalten erstellen oder Daten auf der Grundlage von Bedingungen umwandeln kannst, die auf bestehende Spalten angewendet werden.
In diesem Artikel erklären wir dir, was ein CASE-Statement ist, warum es wichtig ist und welche Anwendungsfälle dir helfen, das Potenzial dieses Statements auszuschöpfen. Lass uns loslegen!
Was ist ein CASE Statement?
Die Case-Anweisung in SQL ist ein bedingter Ausdruck, der eine Entscheidungslogik in deine Abfrage einführt. Sie funktioniert ähnlich wie eine if-elif-else-Anweisung in Pythonund ermöglicht es dir, mehrere Bedingungen auszuwerten und bestimmte Ergebnisse auf der Grundlage dieser Bedingungen zurückzugeben.
Die allgemeine Syntax lautet wie folgt:
CASE
WHEN boolean_condition1 THEN result1
WHEN boolean_condition2 THEN result2
ELSE result3
END
So funktioniert es:
- Das Schlüsselwort CASE markiert den Anfang des Ausdrucks, während END den Abschluss markiert und die bedingte Anweisung wie einen Rahmen umschließt.
- Jede WHEN-Klausel wertet eine Bedingung aus. Wenn die Bedingung wahr ist, liefert die entsprechende DANN-Klausel ein bestimmtes Ergebnis.
- Wenn keine der Bedingungen in den WHEN-Klauseln erfüllt ist, liefert die ELSE-Klausel ein Standardergebnis.
Warum ist die CASE-Anweisung wichtig?
Die CASE WHEN-Anweisung ist ein wertvolles Werkzeug in SQL-Abfragen und bietet mehrere wichtige Vorteile:
- Datenumwandlung: ermöglicht es dir, neue Spalten auf der Grundlage der Werte bestehender Spalten zu erstellen.
- Bedingte Aggregation: Ermöglicht es dir, aggregierte Werte (z. B. Summen, Zählungen, Maximalwerte) für bestimmte Teilmengen von Daten auf der Grundlage von Bedingungen zu erstellen.
- Datenfilterung: Du kannst Zeilen anhand bestimmter Kriterien ein- oder ausschließen.
- Vereinfachung und Lesbarkeit von Abfragen: Sie hilft dabei, die Logik in einer einzigen Abfrage zu konsolidieren, sodass nicht mehr mehrere Abfragen, temporäre Tabellen oder komplexe Joins erforderlich sind.
- Leistungsoptimierung: Durch die Verringerung der Komplexität der SQL-Abfragen kann die CASE-Anweisung auch zur Optimierung der Leistung und zur Minimierung der Ausführungszeit beitragen, insbesondere wenn sie zusätzliche Berechnungen und Transformationen vermeidet.
Einfache CASE-Anweisung
In diesem Artikel werden wir die Tabelle film
der Datenbank cinema
verwenden. Nehmen wir an, wir wollen eine neue kategorische Spalte erstellen, die auf den Werten des ROI (Brutto-Budget-Verhältnis) basiert:
SELECT
title,
gross,
budget,
gross / budget AS ROI,
CASE
WHEN gross / budget < 1 THEN 'low ROI'
WHEN gross / budget BETWEEN 1 AND 2 THEN 'medium ROI'
ELSE 'high ROI'
END as ROI_group
FROM cinema.films
WHERE budget > 0 AND gross > 0 AND release_year = 2015;
Anhand des Bruttobetrags und des Budgets haben wir den ROI berechnet, eine beliebte Rentabilitätskennzahl, die den Ertrag einer Investition misst.
Zusätzlich zum ROI-Feld haben wir auch seine Kategorisierung erhalten, um besser kommunizieren zu können:
- Wenn die Filme mit ROI kleiner als 1 sind, ist der Wert "niedriger ROI".
- Die Filme mit einem ROI zwischen 1 und 2 gehören zur Kategorie "mittlerer ROI".
- "Hoher ROI" ist die Bezeichnung für Filme mit einem ROI größer oder gleich 2.
Wir haben auch nach Filmen gefiltert, deren Budget oder Bruttowert null oder negativ ist. Außerdem haben wir die Ergebnisse auf Filme beschränkt, die im Jahr 2015 veröffentlicht wurden.
CASE in der Gruppenklausel verwenden
Im ersten Beispiel haben wir ein neues Feld erstellt, mit dem wir die Daten aggregieren und zusätzliche Erkenntnisse gewinnen können.
Wir können zum Beispiel das durchschnittliche Brutto und das durchschnittliche Budget für jede Gruppe von ROI berechnen:
SELECT
CASE
WHEN gross / budget < 1 THEN 'low ROI'
WHEN gross / budget BETWEEN 1 AND 2 THEN 'medium ROI'
ELSE 'high ROI'
END AS ROI_group,
avg(gross) as avg_gross,
avg(budget) as avg_budget
FROM cinema.films
WHERE budget > 0 AND gross > 0 AND release_year = 2015
GROUP BY
CASE
WHEN gross / budget < 1 THEN 'low ROI'
WHEN gross / budget BETWEEN 1 AND 2 THEN 'medium ROI'
ELSE 'high ROI'
END
ORDER BY avg(gross) DESC
;
Um die Daten zu gruppieren, fügen wir einfach die Case-Anweisung in die GROUP BY-Klausel ein. Um weitere Einblicke zu erhalten, haben wir die Zeilen in absteigender Reihenfolge nach dem durchschnittlichen Brutto geordnet. Auf diese Weise können wir feststellen, dass der höchste durchschnittliche Bruttoertrag dem hohen ROI zugeordnet ist und umgekehrt für den niedrigen ROI.
CASE in der WHERE-Klausel verwenden
Ein weiterer Vorteil der CASE-Anweisung ist, dass sie es ermöglicht, Zeilen nach bestimmten Bedingungen zu filtern. Zum Beispiel können wir je nach Sprache des Films unterschiedliche ROI-Schwellenwerte anwenden. Es ist bekannt, dass englische Filme einen konstant hohen ROI haben. Die Schwelle sollte also einen höheren Wert haben, während wir annehmen, dass die anderen Sprachen einen niedrigeren ROI haben.
SELECT
title,
gross,
budget,
language,
gross / budget AS ROI
FROM cinema.films
WHERE
CASE
WHEN language = 'English' THEN gross / budget > 2 -- English films need ROI > 2
WHEN language = 'French' THEN gross / budget > 1.5 -- French films need ROI > 1.5
ELSE gross / budget > 1.3 -- Default for other languages
END;
Berechnung der Aggregationen
Es kann auch interessant sein, die Anzahl der Filme mit hohem ROI im Vergleich zu niedrigem ROI zu berechnen, die 2015 veröffentlicht wurden:
SELECT
SUM(CASE WHEN gross / budget > 2 THEN 1 ELSE 0 END) AS high_roi_films,
SUM(CASE WHEN gross / budget BETWEEN 1 AND 2 THEN 1 ELSE 0 END) AS medium_roi_films,
SUM(CASE WHEN gross / budget < 1 THEN 1 ELSE 0 END) AS low_roi_films
FROM cinema.films
WHERE budget > 0 AND gross > 0 AND release_year = 2015;
In der Funktion SUMME erstellen wir ein neues Feld mit dem Wert 1, wenn der ROI den Schwellenwert erreicht, und 0, wenn nicht. Wenn wir die Summe dieser neuen binären Variable nehmen, erhalten wir die Anzahl der Filme, die dieses Kriterium erfüllen.
Anhand der Ergebnisse können wir feststellen, dass die meisten Filme einen ROI von weniger als 1 haben, während nur wenige Filme hochprofitabel sind.
Verschachtelte Fall-Anweisung
Einer der fortschrittlichsten Anwendungsfälle ist die verschachtelte Fallanweisung, die ein Fall in einem Fall ist. Sie ist sehr nützlich, wenn du die Daten in Untergruppen aufteilen und für jede Untergruppe eine andere Logik anwenden musst.
Ähnlich wie im ersten Beispiel wollen wir eine neue Spalte erstellen, die von den Werten des ROI beeinflusst werden soll. Wie wir bereits gesagt haben, ist der ROI für englischsprachige Filme im Vergleich zu den Filmen in anderen Sprachen weltweit hoch.
Aus diesem Grund wäre es besser, die Filme in ROI-Gruppen einzuteilen, indem man sowohl den ROI als auch die Sprache berücksichtigt
SELECT
title,
language,
gross / budget AS ROI,
CASE
WHEN language = 'English' THEN
CASE
WHEN gross / budget < 2 THEN 'low ROI'
WHEN gross / budget BETWEEN 2 AND 3 THEN 'medium ROI'
ELSE 'high ROI'
END
ELSE
CASE
WHEN gross / budget < 1 THEN 'low ROI'
WHEN gross / budget BETWEEN 1 AND 2 THEN 'medium ROI'
ELSE 'high ROI'
END
END AS ROI_group
FROM cinema.films
WHERE budget > 0 AND gross > 0 and release_year = 2006;
In der Abfrage wird die äußere CASE-Anweisung verwendet, um festzustellen, ob die Sprache Englisch ist oder nicht. Je nach Sprache bewertet der innere CASE den ROI: Die Schwellenwerte sind bei englischen Filmen höher und bei nicht-englischen Filmen niedriger. Diese mehrstufige Bedingung ermöglicht es, die Trennung von Filmen mit niedrigem, mittlerem und hohem Roi zu verbessern.
Fazit
Die CASE-Anweisung ist ein unverzichtbares SQL-Konstrukt, um aussagekräftige Erkenntnisse aus deinen Daten zu gewinnen. Die Theorie wechselt sich mit praktischen Beispielen ab, um dir zu helfen, diesen mächtigen bedingten Ausdruck tief zu verstehen. Wenn du tiefer einsteigen willst, schau dir den Datenbearbeitung in SQL-Kurs. Er behandelt die CASE-Anweisung sowie andere wichtige SQL-Aspekte wie Unterabfragen und Fensterfunktionen. Schließlich solltest du die SQL-Grundlagen um einen Überblick über die Kurse zu bekommen, die dir helfen, SQL zu beherrschen.