SQL Academy · Lección

CASE en ORDER BY y agregaciones

Ordenación y recuento condicionales

Lección 4 de 413 pasos

CASE en ORDER BY y agregaciones es una lección gratuita de SQL Academy en CoddyKit. Esta es la lección 4 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de SQL Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de SQL Academy incluye 4 lecciones en total.

Ordenar con una prioridad personalizada

La cláusula ORDER BY de SQL normalmente ordena las filas según el valor natural de una columna. Sin embargo, puede incluir una expresión CASE dentro de ORDER BY para crear un orden completamente personalizado, uno que ninguna columna individual podría producir por sí sola.

Esta técnica resulta muy útil cuando las reglas de negocio determinan la prioridad, en lugar de los valores sin procesar de los datos.

SELECT product_name, status
FROM products
ORDER BY
  CASE status
    WHEN 'urgent'   THEN 1
    WHEN 'active'   THEN 2
    WHEN 'pending'  THEN 3
    ELSE                 4
  END;

Cómo funciona CASE dentro de ORDER BY

Cuando la base de datos evalúa ORDER BY CASE ... END, calcula un entero (o cualquier valor comparable) para cada fila. Después, las filas se ordenan según ese valor calculado, en lugar de una columna sin procesar o además de ella.

La expresión CASE no se almacena; solo existe durante la ejecución de la consulta.

SELECT order_id, priority
FROM orders
ORDER BY
  CASE priority
    WHEN 'high'   THEN 1
    WHEN 'medium' THEN 2
    WHEN 'low'    THEN 3
    ELSE               9
  END,
  order_id;

Ordenar los NULL explícitamente

De forma predeterminada, las distintas bases de datos colocan los NULL al principio o al final de un resultado ordenado de maneras diferentes. Un CASE en ORDER BY le permite decidir exactamente dónde aparecen los NULL, independientemente del motor de base de datos.

SELECT employee_name, manager_id
FROM employees
ORDER BY
  CASE WHEN manager_id IS NULL THEN 0 ELSE 1 END,
  manager_id;

Orden ascendente y descendente condicional

Un CASE en ORDER BY también puede simular una dirección condicional. Al asignar valores negativos a las categorías, puede invertir eficazmente el orden para grupos específicos y mantener el orden normal para los demás.

Esto resulta útil cuando distintos tipos de filas necesitan una lógica de ordenación diferente dentro de un mismo conjunto de resultados.

SELECT task_name, due_date, is_overdue
FROM tasks
ORDER BY
  CASE WHEN is_overdue = 1 THEN 0 ELSE 1 END,
  due_date;

CASE dentro de COUNT

Puede incluir una expresión CASE dentro de una función de agregación como COUNT. El truco consiste en devolver un valor no NULL para las filas que desea contar y NULL para las que desea omitir, ya que COUNT ignora los NULL.

SELECT
  COUNT(CASE WHEN status = 'active'   THEN 1 END) AS active_count,
  COUNT(CASE WHEN status = 'inactive' THEN 1 END) AS inactive_count
FROM users;

CASE dentro de SUM: totales condicionales

Colocar CASE dentro de SUM permite sumar valores solo cuando una condición es verdadera y tratar las filas que no coinciden como cero. Este es un patrón muy habitual en informes de tipo tabla dinámica que dividen una sola columna en varias columnas de métricas.

SELECT
  SUM(CASE WHEN region = 'North' THEN sales_amount ELSE 0 END) AS north_total,
  SUM(CASE WHEN region = 'South' THEN sales_amount ELSE 0 END) AS south_total,
  SUM(CASE WHEN region = 'East'  THEN sales_amount ELSE 0 END) AS east_total
FROM sales;

AVG condicional con CASE

El mismo patrón funciona con AVG. Como AVG ignora los NULL, devolver NULL para las filas que desea excluir produce el promedio únicamente de las filas coincidentes, sin necesidad de una subconsulta.

SELECT
  AVG(CASE WHEN department = 'Engineering' THEN salary END) AS avg_eng_salary,
  AVG(CASE WHEN department = 'Marketing'   THEN salary END) AS avg_mkt_salary
FROM employees;

Agrupar con CASE: categorizar filas

Puede usar CASE en la lista de GROUP BY o de SELECT para agrupar valores continuos en categorías y, después, agregar cada categoría. Esto convierte una columna numérica en grupos etiquetados sin modificar los datos subyacentes.

SELECT
  CASE
    WHEN age < 18             THEN 'Under 18'
    WHEN age BETWEEN 18 AND 35 THEN '18-35'
    WHEN age BETWEEN 36 AND 55 THEN '36-55'
    ELSE                            '56+'
  END AS age_group,
  COUNT(*) AS user_count
FROM users
GROUP BY
  CASE
    WHEN age < 18             THEN 'Under 18'
    WHEN age BETWEEN 18 AND 35 THEN '18-35'
    WHEN age BETWEEN 36 AND 55 THEN '36-55'
    ELSE                            '56+'
  END;

Usar un alias en lugar de repetir CASE

Repetir una expresión CASE larga tanto en SELECT como en GROUP BY resulta verboso. Algunas bases de datos (MySQL y PostgreSQL con ciertas soluciones alternativas) permiten hacer referencia al alias en ORDER BY, pero no en GROUP BY. El enfoque portátil más seguro consiste en envolver la consulta en una subconsulta o CTE y usar GROUP BY con el alias desde allí.

WITH scored AS (
  SELECT
    customer_id,
    CASE
      WHEN total_spent >= 1000 THEN 'Gold'
      WHEN total_spent >= 500  THEN 'Silver'
      ELSE                          'Bronze'
    END AS tier
  FROM customers
)
SELECT tier, COUNT(*) AS customer_count
FROM scored
GROUP BY tier
ORDER BY
  CASE tier
    WHEN 'Gold'   THEN 1
    WHEN 'Silver' THEN 2
    ELSE               3
  END;

Combinar ORDER BY CASE con ASC / DESC

Después de la expresión CASE, todavía puede añadir ASC o DESC y agregar más columnas de ordenación separadas por comas. La puntuación de CASE es solo la primera clave de ordenación; las columnas posteriores resuelven los empates de la forma habitual.

SELECT
  ticket_id,
  category,
  created_at
FROM support_tickets
ORDER BY
  CASE category
    WHEN 'billing'  THEN 1
    WHEN 'outage'   THEN 2
    WHEN 'feature'  THEN 3
    ELSE                 4
  END ASC,
  created_at ASC;

Ejemplo del mundo real — Panel de ventas

Aquí tiene una consulta realista que combina una agregación basada en CASE con una ordenación basada en CASE. Genera un resumen de ventas por región ordenado de modo que la región con mayores ingresos aparezca siempre primero y 'Other' quede al final.

SELECT
  CASE
    WHEN region IN ('North', 'South', 'East', 'West') THEN region
    ELSE 'Other'
  END AS region_label,
  SUM(CASE WHEN status = 'completed' THEN amount ELSE 0 END) AS completed_sales,
  COUNT(CASE WHEN status = 'refunded' THEN 1 END)           AS refund_count
FROM orders
GROUP BY
  CASE
    WHEN region IN ('North', 'South', 'East', 'West') THEN region
    ELSE 'Other'
  END
ORDER BY completed_sales DESC;

Comprobación de conocimientos

Compruebe cuánto ha entendido sobre el uso de CASE dentro de ORDER BY y de las funciones de agregación.

Resumen de la lección

En esta lección ha aprendido a combinar CASE con ORDER BY y las funciones de agregación:

  • CASE en ORDER BY — asignar puntuaciones de ordenación personalizadas a las filas, controlar dónde aparecen los valores NULL y combinar varias reglas de ordenación en una sola consulta.
  • CASE en COUNT — devolver un valor que no sea NULL para incluir las filas y NULL, de forma implícita o explícita, para omitirlas.
  • CASE en SUM / AVG — usar 0 o NULL como valor de ELSE para obtener totales y promedios condicionales en una sola pasada.
  • CASE en GROUP BY — agrupar valores continuos o categóricos en grupos etiquetados para realizar agregaciones.

Estos patrones eliminan muchas subconsultas y facilitan la escritura de informes con formato de tabla dinámica usando SQL estándar.

Gratis para empezar

Aprende SQL con un tutor de IA — gratis

Escribe y ejecuta código real en tu navegador, obtén ayuda instantánea de un tutor de IA disponible 24/7 y continúa donde lo dejaste en la web o en la aplicación.

Cursos
46
Lecciones
183

Preguntas frecuentes

¿La lección «CASE en ORDER BY y agregaciones» es gratis?

Sí — el texto completo de «CASE en ORDER BY y agregaciones» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de SQL Academy, actualiza a CoddyKit PRO. El curso de SQL Academy incluye 4 lecciones en total.

¿Qué aprenderé en «CASE en ORDER BY y agregaciones»?

Ordenación y recuento condicionales Practicas SQL Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.

¿Necesito experiencia previa para empezar SQL Academy?

No se requiere experiencia previa. SQL Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 4 de 4.

¿Cuánto tiempo toma la lección «CASE en ORDER BY y agregaciones»?

La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.

¿Puedo escribir y ejecutar código en esta lección de SQL Academy?

Sí. Cada lección de SQL Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.

Todas las lecciones de este curso

  1. La expresión CASE
  2. CASE buscado frente a CASE simple
  3. Agrupación y etiquetado de datos
  4. CASE en ORDER BY y agregaciones
← Volver a SQL Academy