Kolejność SQL w wielu kolumnach

634

Próbuję sortować według wielu kolumn w SQL i w różnych kierunkach. column1będą sortowane malejąco i column2rosnąco.

W jaki sposób mogę to zrobić?

Señor Reginold Francis
źródło
85
To jest pierwszy wynik „odpowiedzi Google”. Przynajmniej tak było, kiedy przejrzałem „sql porządkowanie według dwóch kolumn”. Jest o wiele bardziej czytelny niż równoważna oficjalna strona z dokumentami, która nawet nie pojawiła się na mojej pierwszej stronie wyników, dopóki nie zmieniłem zapytania na „mysql 'order by” ”
Andrew Martin
11
Biorąc pod uwagę, jak często pytanie SO pojawia się na szczycie Google, zawsze uważam, że okropne jest odpowiadanie na nie przez ludzi. SO jest albo tutaj odpowiedzieć, czy nie, i nie mogę zrozumieć, dlaczego kierowanie ruchu na stronie z dala to dobra rzecz
user001

Odpowiedzi:

1022
ORDER BY column1 DESC, column2

Sortuje wszystko column1najpierw (malejąco), a następnie column2(rosnąco, co jest ustawieniem domyślnym), gdy column1pola dla dwóch lub więcej wierszy są równe.

Ignacio Vazquez-Abrams
źródło
2
tutaj jak zamówić kolumnę 1 lub kolumnę 2?
PoliDev,
@PoliDev, Najpierw sortuje według kolumny 1 w kolejności malejącej i według kolumny 2 (w kolejności rosnącej)
zaheer
110
Dla jasności sortuje to wszystko column1najpierw, a następnie za column2każdym razem, gdy column1pola dla dwóch wierszy są równe.
Nick Benes
2
Będzie działał dla dowolnej liczby wyrażeń ( nie tylko kolumn), aż do limitu RDBMS.
Ignacio Vazquez-Abrams
2
@NickBenes ... lub można powiedzieć: sortuje według, column2a następnie wykonuje sortowanie STABILNE według column1. Jest to bardziej jasne dla osób, które wiedzą, czym jest stabilne sortowanie.
Atom
356

Inne odpowiedzi nie zawierają konkretnego przykładu, więc oto:

Biorąc pod uwagę następującą tabelę Ludzie :

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

Jeśli wykonasz zapytanie poniżej:

SELECT * FROM People ORDER BY FirstName DESC, YearOfBirth ASC

Zestaw wyników będzie wyglądał następująco:

 FirstName |  LastName   |  YearOfBirth
----------------------------------------
  Thomas   | More        |   1478
  Thomas   | Jefferson   |   1826
  Thomas   | Alva Edison |   1847
  Benjamin | Franklin    |   1706
Thomas CG de Vilhena
źródło
23
Ta odpowiedź jest doskonałym uzupełnieniem bardzo pomocnej i krótkiej akceptowanej odpowiedzi.
kraina krańców
3
Jest to dobry przykład, wielu uważa, że ​​w jaki sposób można posortować 2 kolumny za jednym razem, co tak naprawdę nie dzieje się, nawet jeśli wstawisz 2 kolumny do zapytania o zamówienie
Muhammad Faraz
Zapewnia takie same wyniki, gdy sortujemy za pomocą trzech kolumn, a kolejność sortowania w pierwszej kolumnie jest taka sama, a reszta wszystko jest inne. Ex: 1.Firstname asc, Lastname desc, yearOfBirst asc and 2.Firstname asc, Lastname desc, yearOfBirst desc Czy jest jakiś sposób, aby to przezwyciężyć?
Paramesh Korrakuti
1
@ParameshKorrakuti: To oczekiwany wynik. Kolejność wynikająca w twoim przykładzie będzie się różnić tylko, jeśli będą zduplikowane FirstName, LastNamewpisy z wyraźnymiYearOfBirth
Thomas CG de Vilhena
Dzięki za przykład, ludzie tacy jak ja rozumieją.
thippu
136
SELECT  *
FROM    mytable
ORDER BY
        column1 DESC, column2 ASC
Quassnoi
źródło
19

Porządkowanie wielu kolumn zależy od odpowiadających im wartości obu kolumn: Oto mój przykład tabeli, w której dwie kolumny nazwane są alfabetami i liczbami, a wartościami w tych dwóch kolumnach są porządek rosnący i malejący .

wprowadź opis zdjęcia tutaj

Teraz wykonuję Order By w tych dwóch kolumnach, wykonując poniższe polecenie:

wprowadź opis zdjęcia tutaj

Teraz ponownie wstawiam nowe wartości w tych dwóch kolumnach, gdzie wartość alfabetu w kolejności ASC :

wprowadź opis zdjęcia tutaj

i kolumny w przykładowej tabeli wyglądają tak. Teraz ponownie wykonaj tę samą operację:

wprowadź opis zdjęcia tutaj

Możesz zobaczyć, że wartości w pierwszej kolumnie są w porządku malejącym, ale w drugiej kolumnie nie ma kolejności ASC.

Jason Clark
źródło
również wstaw te dane (g, 10),(g,12). Następnie uruchom zapytanie według zamówienia, otrzymasz drugą kolumnę jako ASCzamówienie (to znaczyg-10,g-11,g-12)
Pugal
6

Możesz użyć wielokrotnego zamawiania pod wieloma warunkami,

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 
atik sarker
źródło
Czy indeksowanie działa, jeśli użyję „CASE” wewnątrz „ORDER BY”?
Rousonur Jaman,