Zurück zur Artikelliste Artikel
6 Leseminuten

Wie man Werte in einer bestimmten Reihenfolge in SQL sortiert

Manchmal müssen Sie Ihre Daten auf eine bestimmte Art und Weise ordnen, und oft reicht die Verwendung von typischen Sortiermodifikatoren wie ASC und DESC nicht aus. Dieser Artikel zeigt Ihnen, wie Sie die CASE-Anweisung verwenden können, um Ihre Daten genau so zu ordnen, wie Sie es brauchen.

Mussten Sie Ihre Daten schon einmal auf eine ganz bestimmte Weise ordnen? Eine der besten Methoden für die Handhabung komplexer Sortierungen ist die Verwendung von CASE. Die Anweisung CASE ist sehr nützlich, da Sie damit eine if-else-Logik zu Ihren Abfragen hinzufügen können. Wir verwenden diese Logik SQL ORDER BY bestimmte Werte. Sie können mehr über die Anweisung CASE erfahren, indem Sie diesen Artikel lesen , der CASE erklärt und nützliche Beispiele zeigt.

Wir werden diese benutzerdefinierte SQL-Sortierung anhand von 3 verschiedenen Beispielen demonstrieren, die unterschiedliche Datentypen wie Ganzzahlen, Textwerte und Datumsangaben beinhalten.

Für unsere Beispiele verwenden wir die orders Tabelle. Diese Tabelle enthält Informationen über die Produktbestellungen, die unser Unternehmen erhalten hat.

orders

idlocationcountorder_date
1New York132021-05-21
2Boston212020-11-12
3Chicago42021-03-18
4Toronto102019-12-13
5New York202020-01-27
6Boston332019-04-03
7Memphis72021-05-04
8Cleveland182020-07-06
9Philadelphia62019-04-22
10Washington352021-01-07

Benutzerdefinierte Sortierung basierend auf einer Integer-Spalte

Wir haben von unserem Manager die Anweisung erhalten, wie die Daten geordnet werden sollen. Unser Ergebnis muss die folgenden Regeln einhalten:

  • Zuerst sollen die Bestellungen angezeigt werden, bei denen zwischen 10 und 20 Artikel bestellt wurden.
  • Dann werden die Bestellungen angezeigt, bei denen weniger als 10 Artikel bestellt wurden.
  • Schließlich werden die Bestellungen angezeigt, bei denen mehr als 20 Artikel bestellt wurden.

Die Anforderungen sind ziemlich klar, machen wir uns an die Arbeit! Nach einiger Zeit haben wir die folgende SQL-Abfrage erstellt:

SELECT id, count
FROM orders
ORDER BY CASE WHEN count BETWEEN 10 AND 20 THEN 1
              WHEN count < 10 THEN 2
              ELSE 3END

Schlüsseln wir das auf.

Wir wählen id und die Anzahl der Bestellungen, die angezeigt werden sollen. Danach gehen wir direkt zur Reihenfolge der Ergebnisse über, indem wir die ORDER BY Klausel verwenden.

Sie können CASE verwenden, um einen Sortierschlüssel in der ORDER BY Klausel anzugeben, und genau das tun wir hier. Wir geben dem ersten Fall einen Sortierschlüsselwert von 1:

CASE WHEN count BETWEEN 10 AND 20 THEN 1

Für den zweiten Fall geben wir den Sortierschlüsselwert 2 an:

WHEN count < 10 THEN 2

Dadurch wird sichergestellt, dass die Ergebnisse des ersten Falles vor unserem zweiten Fall angezeigt werden. Die letzten Daten, die angezeigt werden sollen, sind die, bei denen die Anzahl der Bestellungen über 20 liegt. Wir können ihnen einen Sortierschlüsselwert von 3 zuweisen:

ELSE 3

Also gut, führen wir unsere Abfrage aus! Dies führt dazu, dass die folgenden Datensätze zurückgegeben werden:

idcount
113
410
520
818
34
77
96
221
633
1035

Es hat funktioniert! Es werden zuerst die Artikel mit einer Bestellmenge zwischen 10 und 20 angezeigt. Danach folgen die Bestellungen, bei denen 10 Artikel bestellt wurden. Und schließlich werden die Bestellungen mit einer Anzahl von mehr als 20 angezeigt.

Dies ist eine recht fortschrittliche Verwendung von CASE. Sie können die Anweisung CASE auch mit Befehlen zur Datenänderung wie INSERT und UPDATE verwenden. Schauen Sie sich diesen Blogbeitrag zu diesem Thema an, wenn Sie wissen möchten, wie das geht.

Benutzerdefinierte Sortierung basierend auf einer Textspalte

Schauen wir uns ein weiteres Beispiel an, nur dass wir dieses Mal eine Textspalte verwenden, um die Reihenfolge festzulegen, in der unsere Daten erscheinen sollen.

Unser Chef hat uns gerade mitgeteilt, dass wir einige der Daten aus unserer Tabelle orders Tabelle anzeigen und nach dem Ort sortieren, an dem die Bestellung aufgegeben wurde.

Zuerst sollen die Bestellungen in New York angezeigt werden, dann die Bestellungen in Boston und schließlich die Bestellungen in Toronto. Die übrigen Auftragsdaten müssen ebenfalls angezeigt werden, wobei die Reihenfolge für die anderen Standorte keine Rolle spielt. Machen wir uns an die Arbeit.

Wir sind bei der folgenden Abfrage angelangt:

SELECT id, location, count, order_date
FROM orders
ORDER BY CASE WHEN location = 'New York' THEN 1
              WHEN location = 'Boston' THEN 2
              WHEN location = 'Toronto' THEN 3
              ELSE 4 END

Diesmal wählen wir alle Spalten aus. Die Verwendung von ORDER BY und CASE ist ähnlich wie in unserem vorherigen Beispiel. Wenn Sie mehr über dieses Thema erfahren möchten, lesen Sie diesen Artikel, der SQL-Datentypen ausführlich behandelt.

Beachten Sie, dass die Reihenfolge, die wir in unserem CASE WHEN Ausdruck verwendet haben, genau unseren Anforderungen entspricht und New York, Boston und dann Toronto anzeigt. Führen wir diese Abfrage aus und sehen wir, ob wir erfolgreich sind.

idlocationcountorder_date
1New York132021-05-21
5New York202020-01-27
2Boston212020-11-12
6Boston332019-04-03
4Toronto102019-12-13
3Chicago42021-03-18
8Cleveland182020-07-06
7Memphis72021-05-04
9Philadelphia62019-04-22
10Washington352021-01-07

Erfolgreich! Dies ist genau die Reihenfolge, in der wir unsere Daten haben wollen. Wir können nun zu unserem letzten Beispiel übergehen. Bisher haben wir sowohl mit Zahlen- als auch mit Textdatentypen gearbeitet.

Benutzerdefinierte Sortierung anhand einer Datumsspalte

In unserem letzten Beispiel verwenden wir den Datentyp "Datum" und zeigen, wie man Datumswerte in die benutzerdefinierten Sortierungen von CASE einbeziehen kann.

Eine weitere Anfrage wurde von unserem Manager eingereicht. Er möchte, dass die Daten in einer bestimmten Reihenfolge auf der Grundlage der Datumsspalte order_date angezeigt werden. Folgendes wurde uns gesagt:

  • Zeigen Sie alle Bestellungen aus dem aktuellen Jahr (2021) an und sortieren Sie diese Daten nach Monat und Tag des Monats in aufsteigender Reihenfolge.
  • Zeigen Sie als nächstes die Daten aus den Vorjahren an, und sortieren Sie diese ebenfalls nach Tag und Monat.

Lassen Sie uns unsere Abfrage schreiben und unser letztes Beispiel für eine SQL ORDER BY CASE durchspielen.

SELECT id, location, count, order_date
FROM orders
ORDER BY 
CASE WHEN EXTRACT(YEAR FROM order_date) = EXTRACT(YEAR FROM CURDATE()) THEN 1
     WHEN EXTRACT(YEAR FROM order_date) = (EXTRACT(YEAR FROM CURDATE()) - 1) THEN 2
     ELSE 3 
END ASC, order_date ASC

Hier gibt es eine Menge aufzuschlüsseln! Legen wir los. Sehen Sie sich den folgenden Ausschnitt an:

CASE WHEN EXTRACT(YEAR FROM order_date) = EXTRACT(YEAR FROM CURDATE()) THEN 1

EXTRACT wird verwendet, um das Jahr aus dem Bestelldatum zu ermitteln. CURDATE() wird verwendet, um das aktuelle Datum zu ermitteln. Weitere Funktionen wie diese finden Sie in diesem Kurs über SQL-Standardfunktionen, in dem Sie lernen, wie Sie numerische, Text- und andere Datentypen mit den am häufigsten verwendeten SQL-Funktionen verarbeiten können.

Wir vergleichen das Jahr von order_date mit dem Jahr des aktuellen Datums. Damit dieser Datensatz als erstes erscheint, setzen wir den Sortierschlüssel auf 1.

WHEN EXTRACT(YEAR FROM order_date) = (EXTRACT(YEAR FROM CURDATE()) - 1) THEN 2

Dies ist ähnlich wie im letzten Abschnitt, nur dass wir das Datum des letzten Jahres verwenden (YEAR FROM CURDATE()) - 1)

Schließlich werden die restlichen Ergebnisse mit diesem Ausschnitt angezeigt:

ELSE 3

Diesmal haben wir auch nach order_date ASC sortiert. Dadurch wird sichergestellt, dass die Monate und Tage dieses Monats in aufsteigender Reihenfolge sortiert werden.

Schauen wir uns das Ergebnis der Abfrage an:

idlocationcountorder_date
10Washington352021-01-07
3Chicago42021-03-18
7Memphis72021-05-04
1New York132021-05-21
5New York202020-01-27
8Cleveland182020-07-06
2Boston212020-11-12
6Boston332019-04-03
9Philadelphia62019-04-22
4Toronto102019-12-13

Unsere Ergebnisse erscheinen genau so, wie wir sie haben wollen! Die neuesten Jahre werden zuerst angezeigt, und jeder Ergebnissatz pro Jahr wird nach den Monaten und Tagen des jeweiligen Jahres sortiert.

SQL ORDER BY Bestimmte Werte

Damit ist unser Blick auf benutzerdefinierte Sortierungen beendet. Wir haben die Komplexität der einzelnen Sortierungen mit jedem Beispiel erhöht. Jetzt sollten Sie in der Lage sein, die Prinzipien aus diesem Artikel auf ein Problem anzuwenden, mit dem Sie möglicherweise konfrontiert sind. Wenn Sie mehr Beispiele sehen möchten, lesen Sie diesen Blogbeitrag über die Sortierung von Datensätzen mit der ORDER BY-Klausel. Dies gilt als ein ziemlich fortgeschrittenes SQL-Thema. Um weitere fortgeschrittene SQL-Probleme zu sehen, schauen Sie sich diesen Fortgeschrittenes SQL Learning Track von LearnSQL.de.