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

Cómo usar CASE WHEN con SUM() en SQL

Este artículo le enseñará qué es una expresión CASE WHEN de SQL, y cómo utilizarla con la función SUM() y con una cláusula GROUP BY. Incluye ejemplos para mejorar su comprensión.

Conocer expresión CASE WHEN de SQL proporciona emocionantes posibilidades en SQL. El que la conoce, pasa de ser un simple usuario que depende de lo que devuelve SQL, a un usuario que está más al mando y que establece criterios específicos en SQL. Cuando se combina con otras funciones y cláusulas, como SUM() y GROUP BY, la expresión CASE WHEN es una poderosa herramienta para crear informes de SQL complejos.

Puede aprender sobre CASE WHEN y sobre cómo usarla con SUM() y GROUP BY en nuestro curso práctico Cómo crear informes básicos con SQL. Si quiere ver más ejercicios de SQL, consulte nuestro programa de enseñanza Ejercicio de SQL, que incluye más de 500 ejercicios interactivos.

¿CASE, CASE WHEN, CASE WHEN THEN o CASE WHEN THEN ELSE?

En sentido estricto, a todas las expresiones anteriores se las denomina expresiones CASE de SQL. A veces, se las llama expresiones CASE WHEN, o de algunas de las formas que mencioné anteriormente. No deje que esto le confunda, todas son lo mismo. Las cláusulas WHEN, THEN y ELSE forman parte de la expresión CASE.

¿Cómo funciona la expresión CASE WHEN?

Puede pensar en ella como un equivalente en SQL de la construcción IF-THEN-ELSE. Es posible que ya esté familiarizado con ella, especialmente, si ya la utilizóado en Excel o en algún otro lenguaje de programación. En cualquier caso, vamos a repasarla aquí.

La construcción IF-THEN-ELSE funciona de la siguiente manera: La función IF ejecuta una prueba lógica, comprueba si una expresión es verdadera o falsa. Si la expresión If es verdadera, asignará el valor que usted especifique. En caso contrario, asignará el otro valor que usted especifique.

La estructura de la expresión CASE WHEN es la misma. Ejecuta una prueba lógica; en el caso de que la expresión case sea verdadera, entonces (then), le asignará un valor específico. En caso contrario (else), le asignará otro valor.

Voy a mostrarle la lógica y la sintaxis de CASE WHEN con un ejemplo.

Ejemplo 1: La expresión CASE WHEN

Tenemos una tabla llamada test_result que contiene los resultados de los exámenes. Sus columnas son las siguientes:

  • id: el ID del alumno.
  • first_name: el nombre del alumno.
  • last_name: el apellido del alumno.
  • score: la puntuación del examen.

La tarea consiste en asignar las categorías de los resultados del examen en función de la puntuación. Esto se hace así:

SELECT	
  first_name,
  last_name,
  score,
  CASE
    WHEN score > 90 THEN 'Exceptional result'
    WHEN score > 70 THEN 'Great result'
    WHEN score > 50 THEN 'Average result'
    ELSE 'Poor result'
  END AS score_category
FROM test_result
ORDER BY score DESC;

La cláusula SELECT selecciona el nombre y los apellidos de los alumnos, y las puntuaciones de los exámenes de la tabla test_result, esto ya sabíamos hacerlo. Pero, entonces, comienza la parte divertida. La expresión CASE comienza, obviamente, con la palabra clave CASE. Después, defino las condiciones que debe comprobar la expresión CASE y los valores que debe asignar. Para ello, utilizo WHEN y THEN. Por ejemplo, si la puntuación es superior a 90, se clasifica como "Exceptional result" (Resultado excepcional). Si es superior a 70, es un "Great result" (Gran resultado). No hace falta escribir explícitamente "and less than 90", ya que SQL tiene en cuenta las otras condiciones, para evitar que se produzcan resultados duplicados o errores.

Siguiendo la misma lógica, toda puntuación superior a 50 se considera un "Average result" (Resultado normal). Las puntuaciones que no satisfagan ninguna de las tres condiciones anteriores se clasifican como "Poor result" (Mal resultado). Recuerde que ELSE se utiliza para asignar un valor a los registros que no cumplen ninguna de las condiciones definidas por CASE y WHEN.

Las expresiones CASE se cierran con END. Después, se puede definir el nombre de la columna en la que se almacenarán los resultados de la cláusula CASE. En este caso, es la columna score_category. También ordené los resultados en orden descendente según la puntuación de la columna. El resultado es el siguiente:

first_namelast_namescorescore_category
BenoitShaughnessy95Exceptional result
LudvigPert92Exceptional result
GizelaShimmings73Great result
CapriceKilshall70Average result
ColinWhinney40Poor result
EtienneMcClaren36Poor result
MistiChazelas32Poor result
ShurlockeGallaccio29Poor result
FreddyBelverstone16Poor result
MariannMariot8Poor result

Tenga en cuenta que no es necesario escribir la condición ELSE en las expresiones CASE. Vamos a intentar omitirla. A continuación, muestro el mismo código que antes, pero sin la condición ELSE:

SELECT	
  first_name,
  last_name,
  score,
  CASE
    WHEN score > 90 THEN 'Exceptional result'
    WHEN score > 70 THEN 'Great result'
    WHEN score > 50 THEN 'Average result'
  END AS score_category
FROM test_result
ORDER BY score DESC;

Y, este es el resultado después de la ejecución del código:

first_namelast_namescorescore_category
BenoitShaughnessy95Exceptional result
LudvigPert92Exceptional result
GizelaShimmings73Great result
CapriceKilshall70Average result
ColinWhinney40NULL
EtienneMcClaren36NULL
MistiChazelas32NULL
ShurlockeGallaccio29NULL
FreddyBelverstone16NULL
MariannMariot8NULL

El código se ejecuta correctamente, pero el resultado es diferente. Ya no existe la categoría "Poor result". En su lugar, hay valores NULL. Recuerde: cuando los valores de las filas no coinciden con ninguna de las condiciones definidas, la expresión CASE devuelve valores NULL.

Si quiere saber más sobre la sintaxis, este artículo muy completo sobre la lógica de CASE WHEN puede serle bastante útil.

Ejemplo 2: La expresión CASE WHEN con un SUM() y un GROUP BY

¡Ahora vamos a ponernos serios! La expresión CASE WHEN a menudo se utiliza con la función SUM() en informes más complejos, lo que puede llegar a ser un reto para los principiantes. Aunque, es posible que usted ya esté acostumbrado a utilizar la función SUM() para sumar valores, sepa que puede utilizarse para contarlos.

Este ejemplo le ayudará a entender mejor el concepto. Utilizaré la tabla subject que tiene las siguientes columnas:

  • id: el ID de la asignatura.
  • name: el nombre de la asignatura.
  • number_of_lectures: el número de clases del año.
  • department: el departamento donde se imparte la asignatura.

La tarea consiste en contar el número de asignaturas obligatorias y optativas por departamento. En este ejemplo, todas las asignaturas que tienen más de 20 clases al año se consideran obligatorias. ¿Sabe cómo resolver esta tarea? Deje que le ayude:

SELECT	
  department,
  SUM (CASE
    WHEN number_of_lectures > 20 THEN 1
    ELSE 0
  END) AS mandatory_subjects,
  SUM (CASE
    WHEN number_of_lectures <= 20 THEN 1
    ELSE 0
  END) AS elective_subjects
FROM subject
GROUP BY department;

Analicemos el código. Para empezar, la consulta selecciona la columna "department" de la tabla subject. Luego, viene el curioso uso de una función SUM() con un CASE WHEN. Esta expresión dice que, cuando el number_of_lectures sea mayor que 20, se asignará a la fila el valor 1. Si la condición no se cumple, el valor asignado es 0.

La función SUM() sumará todas aquellas filas que tengan 1 como valor asignado. Pensemos por un momento, si se suman todos los 1, ¿qué se obtiene? Exactamente, es lo mismo que si se hubieran contado las filas cuyo number_of_lectures es superior a 20. Utilizar una expresión CASE WHEN para asignar los valores 0 o 1 a las filas de la tabla es un pequeño truco para que SUM() devuelva el número de filas, tal y como lo haría la función COUNT(). El número de asignaturas con más de 20 clases se mostrará en la columna mandatory_subjects.

La misma lógica se aplica a la siguiente expresión CASE WHEN. La única diferencia es que esa condición se refiere a 20 clases, o menos, y el resultado se muestra en la columna elective_subjects.

Por último, el resultado de la consulta se agrupa en base a la columna "department". Este es el resultado de esta consulta:

departmentmandatory_subjectselective_subjects
Economics21
Literature20
Philosophy22

Si tiene problemas con el uso de GROUP BY, este artículo que explica su lógica le será útil. Y, si quiere tener algunos ejemplos buenos, este artículo incluye cinco ejemplos de GROUP BY.

Déjeme mostrarle otro ejemplo de la expresión CASE WHEN. Dicen que a la perfección se llega a través de la práctica. Bueno, eso no es del todo cierto; ¡la perfección no existe! Es posible que la práctica no le haga perfecto, pero, seguramente, mejorará su escritura de código.

Ejemplo 3: Cómo usar una expresión CASE WHEN con un SUM() y un GROUP BY

En este último ejemplo, utilizaré la tabla orders, que contiene las siguientes columnas:

  • id: el ID del pedido.
  • total_price: el precio total del pedido.
  • order_date: la fecha del pedido.
  • status: el estado del pedido.
  • ship_country: el país al que se envía el pedido.

Su tarea es mostrar el número de pedidos enviados por cada país. El pedido está enviado si su estado es "shipped" (enviado) o "delivered" (entregado). Este código le permitirá obtener el resultado que desea:

SELECT 
  ship_country,
  SUM(CASE
    WHEN status = 'shipped' OR status = 'delivered' THEN 1
    ELSE 0
  END) AS order_shipped
FROM orders
GROUP BY ship_country;

El código selecciona la columna ship_country de la tabla orders. Luego, utiliza una expresión CASE WHEN para asignar el valor 1 a todas las filas que tienen el estado "shipped" o "delivered". Al resto, les asignará el valor 0. A la nueva columna, la llama order_shipped. Por último, el resultado se agrupa en base a la columna ship_country. Este es el resultado de la consulta:

ship_countryorder_shipped
Netherlands2
Poland1
Spain4

Si está interesado en utilizar la función SUM() de una forma más convencional, aquí tiene un artículo que le ayudará a utilizarla para hacer resúmenes condicionales.

¿Está empezando a descubrir las posibilidades de la expresión CASE WHEN?

Este artículo explicó la lógica y mostrado ejemplos de cómo funciona la expresión CASE WHEN, y espero que le haya ayudado a entenderla a un nivel general. Las expresiones CASE WHEN realmente proporcionan muchas opciones para SQL, y se vuelven aún más poderosas cuando se combinan con funciones de agregado, como SUM(), lo que mostré en dos ejemplos.

Si quiere saber más, tiene más información en el curso Cómo crear informes básicos con SQL. Puede leer más sobre ese curso en el episodio de nuestra serie Curso del mes. Si quiere ver más ejercicios de SQL, consulte nuestro programa de enseñanza Ejercicio de SQL. ¡Tiene más de 500 ejercicios de SQL y cada vez añadimos más!