Ordre de plusieurs colonnes SQL

635

J'essaie de trier par plusieurs colonnes en SQL et dans des directions différentes. column1serait trié par ordre décroissant et column2croissant.

Comment puis-je faire ceci?

Señor Reginold Francis
la source
85
C'EST le premier résultat "googler les réponses". Au moins, c'était quand j'ai googlé "commande SQL par deux colonnes". C'est beaucoup plus lisible que la page de documentation officielle équivalente qui n'apparaissait même pas dans ma première page de résultats jusqu'à ce que je change ma requête en "mysql 'order by'"
Andrew Martin
11
Étant donné la fréquence à laquelle une question SO arrive en tête de Google, je trouve toujours terrible que les gens répondent avec elle. SO est là pour répondre ou non, et je ne comprends pas pourquoi diriger le trafic vers le site est une bonne chose
user001

Réponses:

1023
ORDER BY column1 DESC, column2

Cela trie tout par column1(décroissant) d'abord, puis par column2(croissant, qui est la valeur par défaut) chaque fois que les column1champs de deux lignes ou plus sont égaux.

Ignacio Vazquez-Abrams
la source
2
ici comment commander la colonne1 ou la colonne2?
PoliDev
@PoliDev, Il classe d'abord par colonne1 dans l'ordre décroissant et par colonne2 (dans l'ordre ascendant)
zaheer
110
Pour plus de clarté, cela trie tout d' column1abord, puis par column2chaque fois que les column1champs de deux lignes sont égaux.
Nick Benes
2
Cela fonctionnera pour n'importe quel nombre d'expressions ( pas seulement pour les colonnes), jusqu'à la limite de votre SGBDR.
Ignacio Vazquez-Abrams
2
@NickBenes ... ou vous pourriez dire: il trie column2puis effectue un tri STABLE par column1. Ceci est plus clair pour les personnes qui savent ce qu'est un tri stable.
Atom
356

Les autres réponses manquent d'un exemple concret, alors voici:

Étant donné la table People suivante :

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

Si vous exécutez la requête ci-dessous:

SELECT * FROM People ORDER BY FirstName DESC, YearOfBirth ASC

L'ensemble de résultats ressemblera à ceci:

 FirstName |  LastName   |  YearOfBirth
----------------------------------------
  Thomas   | More        |   1478
  Thomas   | Jefferson   |   1826
  Thomas   | Alva Edison |   1847
  Benjamin | Franklin    |   1706
Thomas CG de Vilhena
la source
23
Cette réponse est un excellent complément à la réponse très utile et courte acceptée.
enderland
3
C'est un bon exemple, beaucoup pensent que comment pouvez-vous trier 2 colonnes à la fois, ce qui ne se produit pas même si vous mettez 2 colonnes pour la requête de commande
Muhammad Faraz
Il fournit les mêmes résultats lorsque nous trions avec trois colonnes et que l'ordre de tri de la première colonne est le même et que tout reste différent. Ex:: 1.Firstname asc, Lastname desc, yearOfBirst asc and 2.Firstname asc, Lastname desc, yearOfBirst desc Existe - t-il un moyen de surmonter cela?
Paramesh Korrakuti
1
@ParameshKorrakuti: C'est le résultat attendu. L'ordre résultant dans votre exemple ne différerait que s'il y avait des FirstName, LastNameentrées en double avec distinctYearOfBirth
Thomas CG de Vilhena
Merci pour l'exemple, ça fait comprendre aux gens comme moi.
thippu
136
SELECT  *
FROM    mytable
ORDER BY
        column1 DESC, column2 ASC
Quassnoi
la source
19

L'ordre des colonnes multiples dépend des valeurs correspondantes des deux colonnes: voici mon exemple de tableau où se trouvent deux colonnes nommées avec des alphabets et des nombres et les valeurs dans ces deux colonnes sont des ordres asc et desc .

entrez la description de l'image ici

Maintenant, j'exécute Order By dans ces deux colonnes en exécutant la commande ci-dessous:

entrez la description de l'image ici

Maintenant, j'insère de nouvelles valeurs dans ces deux colonnes, où la valeur alphabétique dans l' ordre ASC :

entrez la description de l'image ici

et les colonnes de l'exemple de tableau ressemblent à ceci. Effectuez à nouveau la même opération:

entrez la description de l'image ici

Vous pouvez voir que les valeurs dans la première colonne sont dans l'ordre desc mais la deuxième colonne n'est pas dans l'ordre ASC.

Jason Clark
la source
insérez également ces données également (g, 10),(g,12). Ensuite, exécutez votre requête de commande, vous obtenez la deuxième colonne comme ASCcommande (cela signifieg-10,g-11,g-12)
Pugal
6

Vous pouvez utiliser plusieurs commandes à plusieurs conditions,

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
la source
L'indexation fonctionne-t-elle si j'utilise "CASE" dans "ORDER BY"?
Rousonur Jaman