Volver a la lista de artículos Artículos
Lectura de 6 minutos

Cómo ordenar valores en un orden específico en SQL

A veces se requiere ordenar los datos de una manera particular, y a menudo el uso de los típicos modificadores de ordenación como ASC y DESC no son suficientes. Este artículo le mostrará cómo utilizar la sentencia CASE para ordenar sus datos exactamente como lo necesita.

¿Alguna vez ha necesitado ordenar sus datos de una manera muy específica? Uno de los mejores métodos para manejar la ordenación compleja es utilizar CASE. La sentencia CASE es bastante útil, ya que te permite añadir lógica if-else a tus consultas. Utilizaremos esta lógica SQL ORDER BY valores específicos. Puedes aprender más sobre la sentencia CASE leyendo este artículo que explica CASE junto con mostrar ejemplos útiles.

Demostraremos esta ordenación personalizada SQL a través de 3 ejemplos distintos, que involucran diferentes tipos de datos como enteros, valores de texto y fechas.

Para nuestros ejemplos, utilizaremos la tabla orders tabla. Esta tabla contiene información sobre los pedidos de productos que ha recibido nuestra empresa.

orders

idlocationcountorder_date
1New York132021-05-21
2Boston212020-11-12
3Chicago42021-03-18
4Toronto102019-12-13
5New York202020-01-27
6Boston332019-04-03
7Memphis72021-05-04
8Cleveland182020-07-06
9Philadelphia62019-04-22
10Washington352021-01-07

Ordenación personalizada basada en una columna de enteros

Hemos recibido información de nuestro gerente sobre cómo quiere que se ordenen estos datos. Nuestro resultado debe cumplir con las siguientes reglas:

  • En primer lugar, mostrar los pedidos en los que se han pedido entre 10 y 20 artículos.
  • Luego, mostrar los pedidos en los que se pidieron menos de 10 artículos.
  • Por último, mostrar los pedidos de más de 20 artículos.

Los requisitos son bastante claros, ¡manos a la obra! Después de algún tiempo, hemos producido la siguiente consulta SQL:

SELECT id, count
FROM orders
ORDER BY CASE WHEN count BETWEEN 10 AND 20 THEN 1
              WHEN count < 10 THEN 2
              ELSE 3END

Vamos a desglosar esto.

Seleccionamos la dirección id y el recuento de los pedidos que hay que mostrar. Después de esto, entramos directamente en el orden de nuestros resultados utilizando la cláusula ORDER BY.

Puede utilizar CASE para especificar una clave de ordenación en la cláusula ORDER BY, que es exactamente lo que estamos haciendo aquí. Le damos al primer caso un valor de clave de ordenación de 1:

CASE WHEN count BETWEEN 10 AND 20 THEN 1

Al segundo caso le damos un valor de clave de ordenación de 2:

WHEN count < 10 THEN 2

Esto asegura que los resultados del primer caso se mostrarán antes que los del segundo. Los últimos datos que queremos que se muestren son aquellos en los que el recuento de pedidos es superior a 20. Podemos asignarles un valor de clave de ordenación de 3.:

ELSE 3

Muy bien, ¡ejecutamos nuestra consulta! El resultado es que se devuelven los siguientes registros:

idcount
113
410
520
818
34
77
96
221
633
1035

¡Ha funcionado! Los artículos con un recuento de pedidos entre 10 y 20 se muestran primero. A continuación aparecen los pedidos en los que se han pedido 10 artículos. Y por último, se muestran los pedidos de más de 20.

Este es un uso bastante avanzado de CASE. También puede utilizar la sentencia CASE con comandos de modificación de datos como INSERT y UPDATE. Consulte esta entrada del blog sobre el tema si está interesado en aprender cómo hacerlo.

Ordenación personalizada basada en una columna de texto

Veamos otro ejemplo, excepto que esta vez usaremos una columna de texto para especificar el orden en que deben aparecer nuestros datos.

Nuestro jefe nos acaba de decir que necesitamos mostrar algunos de los datos de nuestra orders tabla y ordenarla en función de la ubicación en la que se realizó el pedido.

Se quieren ver primero los pedidos de Nueva York, seguidos de los pedidos que tuvieron lugar en Boston, y luego los pedidos de Toronto. El resto de los datos de los pedidos también deben mostrarse, pero el orden no importa para las otras ubicaciones. Pongamos manos a la obra.

Llegamos a la siguiente consulta:

SELECT id, location, count, order_date
FROM orders
ORDER BY CASE WHEN location = 'New York' THEN 1
              WHEN location = 'Boston' THEN 2
              WHEN location = 'Toronto' THEN 3
              ELSE 4 END

Esta vez seleccionamos todas las columnas. El uso de ORDER BY y CASE es similar al de nuestro ejemplo anterior.Si quieres aprender más sobre este tema, consulta este artículo que cubre ampliamente los tipos de datos SQL.

Observe que el orden que hemos utilizado en nuestra expresión CASE WHEN coincide exactamente con nuestros requisitos, mostrando Nueva York, Boston y luego Toronto. Vamos a ejecutar esta consulta y ver si tenemos éxito.

idlocationcountorder_date
1New York132021-05-21
5New York202020-01-27
2Boston212020-11-12
6Boston332019-04-03
4Toronto102019-12-13
3Chicago42021-03-18
8Cleveland182020-07-06
7Memphis72021-05-04
9Philadelphia62019-04-22
10Washington352021-01-07

No hay ningún problema. Así es exactamente como queremos que se ordenen nuestros datos. Ahora podemos pasar a nuestro último ejemplo. Hasta ahora hemos trabajado con tipos de datos numéricos y de texto.

Ordenación personalizada basada en la columna Fecha

Para nuestro ejemplo final, utilizaremos el tipo de datos fecha y demostraremos cómo incorporar valores de fecha en sus ordenaciones personalizadas de CASE.

Ha llegado otra petición de nuestro gestor. Quieren que los datos se muestren en un determinado orden basado en la columna de fecha, order_date. Esto es lo que nos han dicho

  • Mostrar todos los pedidos del año en curso (2021) y ordenar estas fechas por el mes y el día del mes en orden ascendente.
  • A continuación, mostrar las fechas de los años anteriores y ordenarlas también por el día y el mes.

Vamos a escribir nuestra consulta y ejecutar nuestro ejemplo final de un SQL ORDER BY CASE.

SELECT id, location, count, order_date
FROM orders
ORDER BY 
CASE WHEN EXTRACT(YEAR FROM order_date) = EXTRACT(YEAR FROM CURDATE()) THEN 1
     WHEN EXTRACT(YEAR FROM order_date) = (EXTRACT(YEAR FROM CURDATE()) - 1) THEN 2
     ELSE 3 
END ASC, order_date ASC

¡Hay mucho que desglosar aquí! Entremos en materia. Examina el siguiente fragmento:

CASE WHEN EXTRACT(YEAR FROM order_date) = EXTRACT(YEAR FROM CURDATE()) THEN 1

EXTRACT se utiliza para obtener el año de la fecha de pedido. CURDATE() se utiliza para obtener la fecha actual. Puedes ver más funciones como estas en este curso de Funciones Estándar de SQL que te enseña cómo procesar datos numéricos, de texto y de otros tipos con las funciones más usadas de SQL.

Comparamos el año de order_date con el año de la fecha actual. Conseguimos que este conjunto de datos aparezca en primer lugar estableciendo la clave de ordenación en 1.

WHEN EXTRACT(YEAR FROM order_date) = (EXTRACT(YEAR FROM CURDATE()) - 1) THEN 2

Esto es similar a la última sección, excepto que estamos utilizando la fecha del último año (YEAR FROM CURDATE()) - 1)

Por último, conseguimos que el resto de los resultados aparezcan utilizando este fragmento:

ELSE 3

Esta vez, también hemos ordenado por order_date ASC. De este modo, los meses y días de ese mes se ordenan de forma ascendente.

Veamos el resultado de la ejecución de esta consulta:

idlocationcountorder_date
10Washington352021-01-07
3Chicago42021-03-18
7Memphis72021-05-04
1New York132021-05-21
5New York202020-01-27
8Cleveland182020-07-06
2Boston212020-11-12
6Boston332019-04-03
9Philadelphia62019-04-22
4Toronto102019-12-13

Los resultados aparecen exactamente como queremos. Los últimos años aparecen primero, y cada conjunto de resultados por año está ordenado por los meses y días de ese año.

SQL ORDER BY Valores específicos

Con esto concluimos nuestra mirada a las ordenaciones personalizadas. Hemos aumentado la complejidad de cada ordenación con cada ejemplo. A estas alturas deberías ser capaz de aplicar los principios de este artículo a un problema que puedas tener. Si necesitas ver más ejemplos, echa un vistazo a este artículo del blog sobre cómo ordenar registros con la cláusula ORDER BY. Esto se considera un tema de SQL bastante avanzado. Para ver más problemas avanzados de SQL revisa esta pista de aprendizaje de SQL avanzado de LearnSQL.es.