Ordenación de múltiples columnas SQL

635

Estoy tratando de ordenar por múltiples columnas en SQL y en diferentes direcciones. column1se ordenarían descendiendo y column2ascendiendo.

¿Cómo puedo hacer esto?

Señor Reginold Francis
fuente
85
Este es el primer resultado de "buscar en Google". Al menos fue cuando busqué en Google "SQL ordenando por dos columnas". Es muchísimo más legible que la página de documentación oficial equivalente que ni siquiera apareció en mi primera página de resultados hasta que cambié mi consulta a "mysql 'ordenar por" "
Andrew Martin
11
Dada la frecuencia con la que una pregunta SO llega a Google, siempre encuentro terrible que la gente responda con ella. SO está aquí para responder o no, y no puedo entender por qué es bueno dirigir el tráfico del sitio
User001

Respuestas:

1023
ORDER BY column1 DESC, column2

Esto ordena todo column1primero (descendente) y luego column2(ascendente, que es el valor predeterminado) siempre que los column1campos para dos o más filas sean iguales.

Ignacio Vazquez-Abrams
fuente
2
Aquí, ¿cómo ordenar column1 o column2?
PoliDev
@PoliDev, primero ordena por columna1 en orden DESCending y por columna2 (en orden ASCending)
zaheer
110
Para mayor claridad, esto ordena todo column1primero y luego column2cada vez que los column1campos para dos filas son iguales.
Nick Benes
2
Funcionará para cualquier número de expresiones ( no solo columnas), hasta el límite de su RDBMS.
Ignacio Vazquez-Abrams
2
@NickBenes ... o podría decir: se ordena column2y luego realiza una clasificación ESTABLE por column1. Esto es más claro para las personas que saben qué es la clasificación estable.
Atom
356

Las otras respuestas carecen de un ejemplo concreto, así que aquí va:

Dada la siguiente tabla de personas :

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

Si ejecuta la consulta a continuación:

SELECT * FROM People ORDER BY FirstName DESC, YearOfBirth ASC

El conjunto de resultados se verá así:

 FirstName |  LastName   |  YearOfBirth
----------------------------------------
  Thomas   | More        |   1478
  Thomas   | Jefferson   |   1826
  Thomas   | Alva Edison |   1847
  Benjamin | Franklin    |   1706
Thomas CG de Vilhena
fuente
23
Esta respuesta es un gran complemento para la respuesta muy útil y brevemente aceptada.
enderland
3
El es un buen ejemplo, muchos piensan que ¿cómo se puede clasificar en 2 columnas sola vez, que en realidad no sucede incluso si pones 2 columnas para la consulta orden
Muhammad Faraz
Proporciona los mismos resultados cuando clasificamos con tres columnas y el orden de clasificación de la primera columna es el mismo y el resto es diferente. Ej:: 1.Firstname asc, Lastname desc, yearOfBirst asc and 2.Firstname asc, Lastname desc, yearOfBirst desc ¿Hay alguna forma de superar esto?
Paramesh Korrakuti
1
@ParameshKorrakuti: Ese es el resultado esperado. El orden resultante en su ejemplo solo diferiría si hubiera FirstName, LastNameentradas duplicadas con distintivoYearOfBirth
Thomas CG de Vilhena
Gracias por el ejemplo, hace que personas como yo entiendan.
Thippu
136
SELECT  *
FROM    mytable
ORDER BY
        column1 DESC, column2 ASC
Quassnoi
fuente
19

El orden de múltiples columnas depende de los valores correspondientes de ambas columnas: Aquí está mi ejemplo de tabla donde hay dos columnas nombradas con Alfabetos y Números y los valores en estas dos columnas son órdenes asc y desc .

ingrese la descripción de la imagen aquí

Ahora realizo Ordenar por en estas dos columnas ejecutando el siguiente comando:

ingrese la descripción de la imagen aquí

Ahora nuevamente inserto nuevos valores en estas dos columnas, donde el valor del Alfabeto en orden ASC :

ingrese la descripción de la imagen aquí

y las columnas en la tabla de Ejemplo se ven así. Ahora nuevamente realice la misma operación:

ingrese la descripción de la imagen aquí

Puede ver que los valores en la primera columna están en orden desc pero la segunda columna no está en orden ASC.

Jason Clark
fuente
También inserte estos datos también (g, 10),(g,12). Luego, ejecute su consulta de orden por orden, obtendrá la segunda columna como ASCorden (eso significag-10,g-11,g-12)
Pugal
6

Puede usar múltiples pedidos en múltiples condiciones,

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
fuente
¿Funciona la indexación si uso "CASE" dentro de "ORDER BY"?
Rousonur Jaman