Zurück zur Artikelliste Artikel
8 Leseminuten

Wie man CASE WHEN mit SUM() in SQL verwendet

In diesem Artikel lernen Sie, was ein CASE WHEN-Ausdruck in SQL ist und wie Sie ihn mit der Funktion SUM() und einer GROUP BY-Anweisung verwenden können. Die beigefügten Beispiele sollen Ihnen das Verständnis erleichtern.

Wenn Sie wissen, wie man einen CASE WHEN Ausdruck in SQL verwendet, erhalten Sie einen Einblick in die spannenden Möglichkeiten von SQL. Damit werden Sie von einem einfachen Benutzer, der sich auf die Ergebnisse von SQL verlässt, zu einem Benutzer, der mehr Kontrolle hat und spezifische Kriterien in SQL festlegt. In Kombination mit anderen Funktionen und Anweisungen, wie SUM() und GROUP BY, ist der CASE WHEN Ausdruck ein leistungsstarkes Werkzeug zur Erstellung komplexer SQL-Berichte.

Sie können mehr über CASE WHEN und seine Verwendung mit SUM() und GROUP BY in unserem praxisnahen Kurs lernen Erstellen einfacher SQL-Berichte. Für weitere SQL-Übungen besuchen Sie unseren SQL-Praxis Kursblock mit über 500 interaktiven Übungen.

CASE, CASE WHEN, CASE WHEN THEN, oder CASE WHEN THEN ELSE?

Streng genommen handelt es sich um eine CASE Anweisung in SQL. Manchmal wird sie auch als CASE WHEN Ausdruck oder einer der anderen oben erwähnten Ausdrücke bezeichnet. Lassen Sie sich davon nicht verwirren; es ist alles dasselbe. Die Klauseln WHEN, THEN und ELSE sind alle Teil der Anweisung CASE.

Wie funktioniert ein CASE WHEN-Ausdruck?

Sie können sich das als SQL-Äquivalent zum IF-THEN-ELSE -Konstrukt vorstellen. Vielleicht sind Sie damit bereits vertraut, insbesondere wenn Sie es in Excel oder einer anderen Programmiersprache verwendet haben. Wie dem auch sei, lassen Sie es uns hier wiederholen.

Das IF-THEN-ELSE -Konstrukt funktioniert wie folgt: Die Anweisung IF führt einen logischen Test durch. Sie prüft, ob ein bestimmter Ausdruck wahr oder falsch ist. Wenn der Ausdruck wahr ist, wird ein bestimmter Wert zugewiesen, den Sie angeben; andernfalls wird ein anderer Wert zugewiesen, den Sie ebenfalls angeben.

Die Struktur des Ausdrucks CASE WHEN ist die gleiche. Er führt einen logischen Test durch; wenn der Ausdruck wahr ist, dann weist er ihm einen bestimmten Wert zu. Andernfalls wird ein anderer Wert zugewiesen.

Ich möchte Ihnen die Logik und die Syntax von CASE WHEN anhand eines Beispiels erläutern.

Beispiel 1: Der CASE WHEN-Ausdruck

Wir haben eine Tabelle namens test_result, die Testresultate enthält. Die Spalten sind:

  • idDie ID des Schülers.
  • first_name: Der Vorname des Schülers.
  • last_name: Der Nachname des Schülers.
  • score: Das Testergebnis.

Die Aufgabe besteht darin, die Kategorien der Testergebnisse entsprechend der Punktzahl zuzuordnen. So wird es gemacht:

SELECT	
  first_name,
  last_name,
  score,
  CASE
    WHEN score > 90 THEN 'Exceptional result'
    WHEN score > 70 THEN 'Great result'
    WHEN score > 50 THEN 'Average result'
    ELSE 'Poor result'
  END AS score_category
FROM test_result
ORDER BY score DESC;

Die Anweisung SELECT wählt die Vor- und Nachnamen der Schüler und ihre Testergebnisse aus der Tabelle test_result. Nichts Ungewöhnliches. Aber dann beginnt der interessante Teil! Die Anweisung CASE beginnt mit dem Schlüsselwort CASE, natürlich. Danach definiere ich die Bedingungen, die von der Anweisung CASE geprüft werden sollen, und die Werte, die zugewiesen werden sollen. Dazu verwende ich WHEN und THEN. Wenn die Punktzahl beispielsweise über 90 liegt, wird sie als "außergewöhnliches Ergebnis" eingestuft. Liegt sie über 70, handelt es sich um ein "hervorragendes Ergebnis". Sie müssen nicht ausdrücklich "und weniger als 90" angeben. SQL berücksichtigt andere Bedingungen, um doppelte Ergebnisse oder Fehler zu vermeiden.

Nach der gleichen Logik wird jede Punktzahl über 50 als "durchschnittliches Ergebnis" betrachtet. Jede Punktzahl, die eine der drei oben genannten Bedingungen nicht erfüllt, wird als "Schlechtes Ergebnis" eingestuft. Denken Sie daran, dass ELSE verwendet wird, um den Wert zuzuweisen, wenn keine der durch CASE und WHEN definierten Bedingungen erfüllt ist.

Eine CASE -Anweisung wird durch ein END abgeschlossen. Danach können Sie den Namen der Spalte definieren, in der die Ergebnisse Ihrer CASE -Anweisung gespeichert werden. In diesem Fall ist es die Spalte score_category. Außerdem habe ich die Ergebnisse in absteigender Reihenfolge nach der Spalte score geordnet. Ich bin mir sicher, Sie wollen das Ergebnis sehen:

first_namelast_namescorescore_category
BenoitShaughnessy95Exceptional result
LudvigPert92Exceptional result
GizelaShimmings73Great result
CapriceKilshall70Average result
ColinWhinney40Poor result
EtienneMcClaren36Poor result
MistiChazelas32Poor result
ShurlockeGallaccio29Poor result
FreddyBelverstone16Poor result
MariannMariot8Poor result

Beachten Sie, dass eine ELSE Bedingung in einer CASE Anweisung nicht zwingend erforderlich ist. Versuchen wir, sie wegzulassen. Hier ist der gleiche Code wie oben, aber ohne die ELSE Bedingung:

SELECT	
  first_name,
  last_name,
  score,
  CASE
    WHEN score > 90 THEN 'Exceptional result'
    WHEN score > 70 THEN 'Great result'
    WHEN score > 50 THEN 'Average result'
  END AS score_category
FROM test_result
ORDER BY score DESC;

Führen Sie den Code aus und prüfen Sie das Ergebnis:

first_namelast_namescorescore_category
BenoitShaughnessy95Exceptional result
LudvigPert92Exceptional result
GizelaShimmings73Great result
CapriceKilshall70Average result
ColinWhinney40NULL
EtienneMcClaren36NULL
MistiChazelas32NULL
ShurlockeGallaccio29NULL
FreddyBelverstone16NULL
MariannMariot8NULL

Der Code wurde ohne Fehler ausgeführt, aber das Ergebnis ist anders. Es gibt keine Kategorie "Schlechtes Ergebnis" mehr. Stattdessen gibt es NULL Werte. Denken Sie daran: Wenn die Zeilen keiner der definierten Bedingungen entsprechen, gibt die Anweisung CASE den Wert NULL zurück.

Wenn Sie sich eingehender mit der Syntax befassen möchten, könnte dieser sehr ausführliche Artikel über die CASE WHEN Logik äußerst hilfreich sein.

Beispiel 2: Der CASE WHEN-Ausdruck mit einem SUM() und einem GROUP BY

Jetzt wird's ernst! Ein CASE WHEN -Ausdruck wird oft mit einer SUM()-Funktion in komplexeren Berichten verwendet, was für Anfänger eine ziemliche Herausforderung darstellen kann. Auch wenn Sie wahrscheinlich gewohnt sind, die Funktion SUM() zum Summieren von Werten zu verwenden, kann sie auch zum Zählen eingesetzt werden.

Dieses Beispiel wird Ihnen helfen, das Konzept besser zu verstehen. Ich verwende die Tabelle subject, die die folgenden Spalten hat:

  • id: Die ID des Fachs.
  • name: Der Name des Faches.
  • number_of_lectures: Die Anzahl der Vorlesungen während des Jahres.
  • department: Der Fachbereich, in dem das Fach unterrichtet wird.

Die Aufgabe besteht darin, die Anzahl der Pflichtfächer und der Wahlfächer nach Fachbereich zu zählen. In diesem Beispiel gilt jedes Fach, das mehr als 20 Vorlesungen im Jahr hat, als Pflichtfach. Wissen Sie, wie Sie diese Aufgabe lösen können? Lassen Sie mich Ihnen helfen:

SELECT	
  department,
  SUM (CASE
    WHEN number_of_lectures > 20 THEN 1
    ELSE 0
  END) AS mandatory_subjects,
  SUM (CASE
    WHEN number_of_lectures <= 20 THEN 1
    ELSE 0
  END) AS elective_subjects
FROM subject
GROUP BY department;

Lassen Sie uns den Code analysieren! Zunächst wird die Spalte Abteilung aus der Tabelle subject ausgewählt. Dann kommt die merkwürdige Verwendung eines SUM() mit einem CASE WHEN. Dieser Ausdruck besagt, dass der Zeile der Wert 1 zugewiesen wird, wenn number_of_lectures größer als 20 ist. Wenn die Bedingung nicht erfüllt ist, wird der Zeile der Wert 0 zugewiesen.

Die Funktion SUM() summiert alle Zeilen, deren zugewiesener Wert gleich 1 ist. Denken Sie einen Moment nach: Wenn Sie alle "1"en addieren, was erhalten Sie dann? Genau, das ist dasselbe, als wenn Sie die Zeilen zählen würden, deren number_of_lectures über 20 liegt. Die Verwendung eines CASE WHEN -Ausdrucks, um den Tabellenzeilen die Werte 0 oder 1 zuzuweisen, ist nur ein kleiner Trick, damit SUM() die Anzahl der Zeilen genauso zurückgibt wie die Funktion COUNT(). Die Anzahl der Fächer mit mehr als 20 Vorlesungen wird in der Spalte mandatory_subjects angezeigt.

Die gleiche Logik gilt für den nächsten CASE WHEN Ausdruck. Der einzige Unterschied besteht darin, dass sich die Bedingung auf 20 oder weniger Vorlesungen bezieht, wobei das Ergebnis in der Spalte elective_subjects angezeigt wird.

Schließlich wird das Ergebnis der Abfrage nach der Spalte Abteilung gruppiert. So sieht das Ergebnis dieser Abfrage aus:

departmentmandatory_subjectselective_subjects
Economics21
Literature20
Philosophy22

Wenn Sie Probleme mit GROUP BY haben, ist dieser Artikel, der die Logik dieses Ausdrucks erklärt, sehr hilfreich. Und wenn Sie auf der Suche nach ein paar schönen Beispielen sind, finden Sie hier einen Artikel mit fünf Beispielen für GROUP BY.

Ich möchte Ihnen ein weiteres Beispiel für den Ausdruck CASE WHEN zeigen. Es heißt, Übung macht den Meister. Nun, das ist nicht ganz richtig. Perfektion gibt es nicht! Es macht Sie vielleicht nicht perfekt, aber Übung macht Sie sicher besser beim Schreiben von Code.

Beispiel 3: Verwendung eines CASE WHEN-Ausdrucks mit einer SUM()- und einer GROUP BY-Anweisung

In diesem letzten Beispiel verwende ich die Tabelle orders. Sie enthält die folgenden Spalten:

  • id: Die ID der Bestellung.
  • total_price: Der Gesamtpreis der Bestellung.
  • order_date: Das Datum der Bestellung.
  • status: Den Status der Bestellung.
  • ship_country: Das Land, in das die Bestellung versandt werden soll.

Ihre Aufgabe ist es, die Anzahl der versendeten Bestellungen nach Land anzuzeigen. Die Bestellung ist versandt, wenn ihr Status "shipped" (deutsch "versandt") oder "delivered" (deutsch "geliefert") ist. Mit diesem Code erhalten Sie das gewünschte Ergebnis:

SELECT 
  ship_country,
  SUM(CASE
    WHEN status = 'shipped' OR status = 'delivered' THEN 1
    ELSE 0
  END) AS order_shipped
FROM orders
GROUP BY ship_country;

Der Code wählt die Spalte ship_country aus der Tabelle orders aus. Er verwendet dann einen Ausdruck CASE WHEN, um allen Zeilen mit dem Status "shipped" oder "delivered" den Wert 1 zuzuweisen. Allen anderen Status wird der Wert 0 zugewiesen. Die neue Spalte erhält den Namen order_shipped. Schließlich wird das Ergebnis nach der Spalte ship_country gruppiert. Hier ist das Ergebnis:

ship_countryorder_shipped
Netherlands2
Poland1
Spain4

Wenn Sie daran interessiert sind, die Funktion SUM() auf konventionellere Weise zu verwenden, finden Sie hier einen Artikel, der Ihnen dabei hilft, sie für die bedingte Zusammenfassung zu verwenden.

Sie beginnen, die Möglichkeiten des CASE WHEN-Ausdrucks zu erschließen?

Ich hoffe, dieser Artikel hat Ihnen geholfen, den Ausdruck CASE WHEN im Allgemeinen zu verstehen, indem er seine Logik erörtert und Ihnen Beispiele für seine Funktionsweise gezeigt hat. Durch die Verwendung des CASE WHEN Ausdrucks entfalten Sie die komplexen Möglichkeiten von SQL. Noch leistungsfähiger wird es, wenn Sie es mit Aggregatfunktionen wie SUM() kombinieren, was ich in zwei Beispielen gezeigt habe.

Noch mehr können Sie im Kurs Erstellen einfacher SQL-Berichte lernen. Lesen Sie mehr über den Kurs in einer Folge unserer Serie " Kurs des Monats ". Weitere SQL-Übungen finden Sie in unserer SQL-Praxis. Sie enthält über 500 SQL-Übungen und wir fügen ständig weitere hinzu!