Ordinamento di più colonne SQL


635

Sto cercando di ordinare in base a più colonne in SQL e in diverse direzioni. column1sarebbe ordinato in ordine decrescente e column2crescente.

Come posso fare questo?


85
Questo è il primo risultato "risposte googling". Almeno è stato quando ho cercato su Google "l'ordinamento sql per due colonne". È molto più leggibile dell'equivalente pagina ufficiale del documento che non è nemmeno apparsa nella mia prima pagina di risultati fino a quando non ho cambiato la mia query in "ordina per" "
Andrew Martin

11
Data la frequenza con cui una domanda SO arriva in cima a Google, trovo sempre terribile che le persone rispondano con essa. SO è qui per rispondere o no, e non riesco a capire perché dirigere il traffico sul sito sia una buona cosa
user001

Risposte:


1023
ORDER BY column1 DESC, column2

Questo ordina prima tutto column1(decrescente) e poi column2(crescente, che è l'impostazione predefinita) ogni volta che i column1campi per due o più righe sono uguali.


2
qui come ordinare colonna1 o colonna2?
PoliDev,

@PoliDev, ordina per colonna1 in ordine DISCending e per colonna2 (in ordine ASCending)
zaheer

110
Per chiarezza, questo ordina column1prima tutto e poi column2ogni volta che i column1campi per due righe sono uguali.
Nick Benes,

2
Funzionerà per qualsiasi numero di espressioni ( non solo colonne), fino al limite del tuo RDBMS.
Ignacio Vazquez-Abrams,

2
@NickBenes ... o potresti dire: ordina per column2e poi esegue l'ordinamento STABILE per column1. Questo è più chiaro per le persone che sanno cos'è l'ordinamento stabile.
Atom

356

Le altre risposte mancano di un esempio concreto, quindi eccolo qui:

Data la seguente tabella Persone :

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

Se si esegue la query di seguito:

SELECT * FROM People ORDER BY FirstName DESC, YearOfBirth ASC

Il set di risultati sarà simile al seguente:

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

23
Questa risposta è un ottimo complemento alla risposta molto utile e brevemente accettata.
enderland,

3
Questo è un buon esempio, molti pensano che come si possano ordinare 2 colonne in una sola volta, cosa che in realtà non accade anche se si mettono 2 colonne per la richiesta dell'ordine
Muhammad Faraz,

Fornisce gli stessi risultati quando ordiniamo con tre colonne e l'ordinamento della prima colonna è lo stesso e tutto è diverso. Es:: 1.Firstname asc, Lastname desc, yearOfBirst asc and 2.Firstname asc, Lastname desc, yearOfBirst desc c'è un modo per superare questo?
Paramesh Korrakuti,

1
@ParameshKorrakuti: Questo è il risultato atteso. L'ordinamento risultante nel tuo esempio sarebbe diverso solo se ci fossero FirstName, LastNamevoci duplicate con distintiYearOfBirth
Thomas CG de Vilhena,

Grazie per l'esempio, fa capire a persone come me.
giovedì

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

19

L'ordinamento di più colonne dipende dai valori corrispondenti di entrambe le colonne: ecco il mio esempio di tabella in cui sono due colonne denominate con alfabeti e numeri e i valori in queste due colonne sono ordini asc e desc .

inserisci qui la descrizione dell'immagine

Ora eseguo Order By in queste due colonne eseguendo il comando seguente:

inserisci qui la descrizione dell'immagine

Ora di nuovo inserisco nuovi valori in queste due colonne, dove il valore Alfabeto in ordine ASC :

inserisci qui la descrizione dell'immagine

e le colonne nella tabella di esempio si presentano così. Ora esegui di nuovo la stessa operazione:

inserisci qui la descrizione dell'immagine

Puoi vedere i valori nella prima colonna sono in ordine decrescente ma la seconda colonna non è in ordine ASC.


inserisci anche questi dati (g, 10),(g,12). Quindi, esegui la query ordine per ordine, otterrai la seconda colonna come ASCordine (ciò significag-10,g-11,g-12)
Pugal

6

Puoi utilizzare più ordini a più condizioni,

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 

L'indicizzazione funziona se uso "CASE" in "ORDER BY"?
Rousonur Jaman,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.