SQL-Reihenfolge für mehrere Spalten


634

Ich versuche, nach mehreren Spalten in SQL und in verschiedene Richtungen zu sortieren. column1würde absteigend und column2aufsteigend sortiert werden .

Wie kann ich das machen?


85
Dies ist das erste Ergebnis "googeln Antworten". Zumindest war es, als ich "SQL-Bestellung nach zwei Spalten" googelte. Es ist verdammt viel besser lesbar als die entsprechende offizielle Dokumentseite, die nicht einmal auf meiner ersten Ergebnisseite erschien, bis ich meine Abfrage in "mysql 'order by'" änderte
Andrew Martin

11
Angesichts der Häufigkeit, mit der eine SO-Frage bei Google auftaucht, finde ich es immer schrecklich, dass die Leute damit antworten. SO ist entweder hier, um zu antworten oder nicht, und ich kann nicht verstehen, warum es eine gute Sache ist, den Site-Verkehr
wegzuleiten

Antworten:


1022
ORDER BY column1 DESC, column2

Dies sortiert alles zuerst nach column1(absteigend) und dann nach column2(aufsteigend, was die Standardeinstellung ist), wenn die column1Felder für zwei oder mehr Zeilen gleich sind.


2
Wie bestelle ich hier entweder Spalte1 oder Spalte2?
PoliDev

@PoliDev, Es bestellt zuerst nach Spalte1 in absteigender Reihenfolge und nach Spalte2 (in aufsteigender Reihenfolge)
zaheer

110
Aus Gründen der Übersichtlichkeit wird alles column1zuerst und dann column2immer dann sortiert, wenn die column1Felder für zwei Zeilen gleich sind.
Nick Benes

2
Es funktioniert für eine beliebige Anzahl von Ausdrücken ( nicht nur für Spalten) bis zum Limit Ihres RDBMS.
Ignacio Vazquez-Abrams

2
@NickBenes ... oder man könnte sagen: Es sortiert nach column2und führt dann eine STABLE-Sortierung nach durch column1. Dies ist klarer für Leute, die wissen, was stabile Sortierung ist.
Atom

356

Den anderen Antworten fehlt ein konkretes Beispiel, also hier geht es:

Angesichts der folgenden Personentabelle :

 FirstName |  LastName   |  YearOfBirth
----------------------------------------
  Thomas   | Alva Edison |   1847
  Benjamin | Franklin    |   1706
  Thomas   | More        |   1478
  Thomas   | Jefferson   |   1826

Wenn Sie die folgende Abfrage ausführen:

SELECT * FROM People ORDER BY FirstName DESC, YearOfBirth ASC

Die Ergebnismenge sieht folgendermaßen aus:

 FirstName |  LastName   |  YearOfBirth
----------------------------------------
  Thomas   | More        |   1478
  Thomas   | Jefferson   |   1826
  Thomas   | Alva Edison |   1847
  Benjamin | Franklin    |   1706

23
Diese Antwort ist eine großartige Ergänzung zu der sehr hilfreichen und kurz akzeptierten Antwort.
Enderland

3
Das ist ein gutes Beispiel, viele denken, wie man 2 Spalten gleichzeitig sortieren kann, was eigentlich nicht passiert, selbst wenn man 2 Spalten für die Bestellabfrage setzt
Muhammad Faraz

Es liefert die gleichen Ergebnisse, wenn wir mit drei Spalten sortieren und die Sortierreihenfolge der ersten Spalte gleich ist und alles anders ist. Bsp.: 1.Firstname asc, Lastname desc, yearOfBirst asc and 2.Firstname asc, Lastname desc, yearOfBirst desc Gibt es eine Möglichkeit, dies zu überwinden?
Paramesh Korrakuti

1
@ParameshKorrakuti: Das ist das erwartete Ergebnis. Die resultierende Reihenfolge in Ihrem Beispiel würde sich nur unterscheiden, wenn es doppelte FirstName, LastNameEinträge mit unterschiedlichenYearOfBirth
Thomas CG de Vilhena

Vielen Dank für das Beispiel, es macht Leute wie mich verständlich.
Thippu

136
SELECT  *
FROM    mytable
ORDER BY
        column1 DESC, column2 ASC

19

Mehrere Reihenfolge der Spalten hängt von den beiden entsprechenden Werte der Spalte: Hier ist meine Tabelle Beispiel , in dem zwei benannten Spalten mit Alphabete und Zahlen und die Werte in diesen beiden Spalten sind asc und desc Aufträge.

Geben Sie hier die Bildbeschreibung ein

Jetzt führe ich Order By in diesen beiden Spalten aus, indem ich den folgenden Befehl ausführe:

Geben Sie hier die Bildbeschreibung ein

Jetzt füge ich wieder neue Werte in diese beiden Spalten ein, wobei der Alphabetwert in ASC- Reihenfolge:

Geben Sie hier die Bildbeschreibung ein

und die Spalten in der Beispieltabelle sehen folgendermaßen aus. Führen Sie nun erneut den gleichen Vorgang aus:

Geben Sie hier die Bildbeschreibung ein

Sie können sehen, dass die Werte in der ersten Spalte in absteigender Reihenfolge sind, die zweite Spalte jedoch nicht in ASC-Reihenfolge.


Fügen Sie auch diese Daten ein (g, 10),(g,12). Führen Sie dann Ihre Order-by-Abfrage aus, und Sie erhalten die zweite Spalte als ASCOrder (das heißtg-10,g-11,g-12)
Pugal

6

Sie können mehrere Bestellungen unter mehreren Bedingungen verwenden.

ORDER BY 
     (CASE 
        WHEN @AlphabetBy = 2  THEN [Drug Name]
      END) ASC,
    CASE 
        WHEN @TopBy = 1  THEN [Rx Count]
        WHEN @TopBy = 2  THEN [Cost]
        WHEN @TopBy = 3  THEN [Revenue]
    END DESC 

Funktioniert die Indizierung, wenn ich "CASE" in "ORDER BY" verwende?
Rousonur Jaman
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.