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

Cómo usar SUM() con GROUP BY: Una Guía Detallada con 8 Ejemplos

Explore algunos ejemplos reales del uso de SUM() y GROUP BY en SQL, desde los más básicos hasta los más sofisticados.

SUM() es una función agregada de SQL que calcula la suma de los valores dados. GROUP BY es una cláusula de SQL que divide las filas en grupos y calcula una función agregada establecida para cada grupo. Utilizando estas dos funciones juntas, puede calcular sumas totales para un grupo de filas.

En este artículo, veremos 8 ejemplos diferentes de cómo puede combinar SUM() y GROUP BY para crear muchos informes diferentes. Hablaremos del caso de uso más básico y cubriremos algunos escenarios complejos.

La mejor forma de refrescar tus conocimientos de SQL -incluidos SUM() y GROUP BY - es nuestra herramienta interactiva Ejercicios prácticos de SQL. Contiene 88 ejercicios interactivos que cubren diferentes temas de SQL. El curso es perfecto para la preparación de entrevistas o un repaso antes de un examen de SQL.

Ejemplo 1: Uso Básico de SUM() y GROUP BY en SQL

Veamos un ejemplo de cómo funciona la función SUM() junto con GROUP BY:

SELECT 
  country, 
  SUM(quantity) AS total_quantity
FROM orders
GROUP BY country;

La consulta devuelve una lista de todos los países encontrados en la tabla orders junto con una suma total de las cantidades pedidas para cada país. Las filas de la tabla orders se dividen en grupos (un grupo por cada país) y la base de datos suma los valores de las cantidades de cada país.

countrytotal_quantity
United States37
United Kingdom43
Mexico12
New Zealand30

Desglose detallado del ejemplo 1

Analicemos este ejemplo en detalle.

Estos son los datos de la tabla orders tabla. Esta tabla sería común en un sistema de comercio electrónico; además del país de destino de la mercancía y la cantidad pedida, incluye datos sobre el vendedor que tomó el pedido, el SKU del producto, la fecha del pedido y la dirección del cliente.

order_noorder_datesalespersonproduct_skuquantityamountaddresscountry
10948022023-04-03Meghan99005500346410845.2528 Morningview Lane New YorkUnited States
10948032023-04-04Stephen99004800642712705.54666 Lawman Avenue AlexandriaUnited States
10948042023-04-05Arthur77006100721915914.423445 Queens Lane LynchburgUnited States
10948052023-04-06Stephen990055003464181012.6693 Iffley Road BrockbridgeUnited Kingdom
10948062023-04-07Meghan990048006427252045.7299 Felix Lane ShirleyUnited Kingdom
10948072023-04-08Arthur770061007219Av. Cantera No. 954 Baja CaliforniaMexico
10948082023-04-05Meghan990055003464Sanchez Marmol 408 TabascoMexico
10948092023-04-06Stephen990048006427197 Glencairn Street DunedinNew Zealand
10948102023-04-04Arthur77006100721916842.06139 Petherick Crescent WellingtonNew Zealand
10948112023-04-09Arthur990055003464Rio Reforma 1730 JaliscoMexico
10948122023-04-08Meghan99004800642712912.45Municipal 114 VeracruzMexico
10948132023-04-06Stephen77006100721914799.45105 Queen Elizabeth II Drive WakapuakaNew Zealand

Utilizaremos la tabla de pedidos a lo largo de este artículo.

La función SUM() en SQL

La función SUM() es una de las funciones agregadas de SQL. Las funciones agregadas en SQL devuelven un único valor para un conjunto de filas. La función SUM() devuelve la suma de los argumentos dados a la función. Existen otras funciones agregadas de SQL, pero en este artículo sólo nos centraremos en SUM().

Cuando agregamos SUM() a la consulta ...

SELECT SUM(quantity)
FROM orders;

... sólo obtendremos un único valor, resultante de sumar todos los valores de cantidad:

SUM(quantity)
122

Tenga en cuenta que la función SUM() ignora los valores NULL. Se tratan como 0s en el cálculo. Para más información sobre la función SUM(), puedes leer esta completa explicación de la función SQL SUM().

La función SUM(), al igual que otras funciones de agregado, se utiliza normalmente con la cláusula GROUP BY.

La cláusula GROUP BY en SQL

La cláusula GROUP BY se utiliza para calcular estadísticas de un grupo de filas; las filas se dividen en grupos en función de los valores de una o más columnas. La sentencia SELECT con GROUP BY devuelve una única fila por cada grupo distinto definido en la cláusula GROUP BY.

Volvamos a nuestra consulta de ejemplo:

SELECT 
  country, 
  SUM(quantity) AS total_quantity
FROM orders
GROUP BY country;

Las filas de la tabla orders se dividen en grupos en función del valor de la columna country gracias a esta línea: GROUP BY country. Indica a la base de datos que coloque las filas con el mismo valor country en un mismo grupo.

order_noorder_datesalespersonproduct_skuquantityamountaddresscountry
10948072023-04-08Arthur770061007219Av. Cantera No. 954 Baja CaliforniaMexico
10948082023-04-05Meghan990055003464Sanchez Marmol 408 TabascoMexico
10948112023-04-09Arthur990055003464Rio Reforma 1730 JaliscoMexico
10948122023-04-08Meghan99004800642712912.45Municipal 114 VeracruzMexico
10948092023-04-06Stephen990048006427197 Glencairn Street DunedinNew Zealand
10948102023-04-04Arthur77006100721916842.06139 Petherick Crescent WellingtonNew Zealand
10948132023-04-06Stephen77006100721914799.45105 Queen Elizabeth II Drive WakapuakaNew Zealand
10948052023-04-06Stephen990055003464181012.6693 Iffley Road BrockbridgeUnited Kingdom
10948062023-04-07Meghan990048006427252045.7299 Felix Lane ShirleyUnited Kingdom
10948022023-04-03Meghan99005500346410845.2528 Morningview Lane New YorkUnited States
10948032023-04-04Stephen99004800642712705.54666 Lawman Avenue AlexandriaUnited States
10948042023-04-05Arthur77006100721915914.423445 Queens Lane LynchburgUnited States

Las filas de México se colocan en un grupo, las de Nueva Zelanda en otro, y así sucesivamente. A continuación, se aplica la función SUM() a los valores de cantidad de cada grupo. La suma de Estados Unidos es la suma de 10, 12 y 15, lo que da como resultado 37. La suma para el Reino Unido es la suma de 18 y 25, lo que da 43, etc.

Aquí está de nuevo el resultado de nuestra consulta. Puede ver que cada fila contiene la suma de los valores de cantidad del grupo correspondiente.

countrytotal_quantity
United States37
United Kingdom43
Mexico12
New Zealand30

La cláusula GROUP BY es especialmente útil cuando se desea obtener información resumida de tablas con demasiadas filas como para recorrerlas una a una. Para obtener más información, lea una explicación completa de la cláusula GROUP BY de SQL o este artículo que explica GROUP BY en SQL.

Ejemplo 2: Cálculo de 2 SUMAS y Agrupación por 2 Columnas

En el ejemplo anterior, vimos cómo utilizar SUM() y GROUP BY para agrupar un conjunto de datos por la columna país y obtener la cantidad total de cada país por separado. También puede agrupar por más de una columna con GROUP BY y calcular más de una suma en una consulta.

Si queremos conocer todas las combinaciones de country y salesperson en la tabla y obtener el total de cantidades pedidas y sus importes para cada combinación, tenemos que utilizar SUM() y GROUP BY.

Esta es la consulta:

SELECT 
  country, 
  salesperson, 
  SUM(quantity) AS qtyTotal,
  SUM(amount) AS amntTotal
FROM orders
GROUP BY country, salesperson;

Basándonos en la tabla anterior, esta consulta da como resultado los siguientes datos:

countrysalespersonqtyTotalamntTotal
United StatesMeghan10845.25
United StatesStephen12705.50
United StatesArthur15914.42
United KingdomStephen181012.65
United KingdomMeghan252045.72
MexicoArthurNULLNULL
MexicoMeghan12912.45
New ZealandStephen14799.45
New ZealandArthur16842.06

Tenemos dos expresiones que utilizan la función SUM() en la consulta: una calcula la cantidad total y la otra calcula el importe total. También agrupamos por dos columnas: country y salesperson.

Internamente, el motor de la base de datos realiza el siguiente procedimiento:

  1. Crea un conjunto de resultados a partir de la tabla especificada en la cláusula FROM, agrupando las filas para cada combinación de valores de las columnas especificadas en la cláusula GROUP BY. En nuestro ejemplo, las filas con el mismo valor de country y salesperson se agrupan: hay una fila para las ventas de Meghan en Estados Unidos, otra para las ventas de Stephen en Estados Unidos, etc.
  2. Para cada fila del conjunto de resultados creado en el paso anterior, calcula la suma de cada columna encerrada en SUM(). En nuestro ejemplo, calcula la suma de las columnas quantity y la suma de las columnas amount.
  3. Devuelve el conjunto de resultados con las sumas.

Si lo necesita, puede agrupar por más de dos columnas. Puede leer sobre la agrupación por múltiples columnas en nuestro artículo Cómo Agrupar por Múltiples Columnas en SQL.

Ejemplo 3: Uso de una Condición WHERE con SUM y GROUP BY

Puede utilizar una condición WHERE en su consulta con SUM() y GROUP BY. En este caso, el motor de base de datos altera el procedimiento visto anteriormente para devolver los resultados de la consulta. Aplica la cláusula WHERE en el paso 1 del procedimiento. A continuación, el conjunto de resultados inicial se reunirá a partir de las filas que cumplan la condición WHERE.

Las columnas implicadas en la condición WHERE pueden ser cualquiera de las columnas de la tabla. No importa si aparecen o no en la cláusula GROUP BY o si se devuelven o no como resultado de la consulta.

Siguiendo con nuestro ejemplo, podríamos utilizar cualquiera de las columnas de la tabla orders por ejemplo product_sku o order_date. Nos interesan los pedidos del producto con el SKU 990048006427 que se hayan realizado entre el 7 de abril de 2023 y el 8 de abril de 2023.

SELECT 
  country, 
  salesperson, 
  SUM(quantity) AS qtyTotal,
  SUM(amount) AS amntTotal
FROM orders
WHERE 
  product_sku = '990048006427' 
  AND order_date BETWEEN '2023-04-07' AND '2023-04-08'
GROUP BY country, salesperson;

Para resolver esta consulta, el motor de base de datos creará primero un conjunto de resultados temporal a partir de la tabla orders que cumpla las condiciones de la cláusula WHERE. De ese conjunto de resultados, tomará todas las combinaciones de las columnas country y salesperson. Para cada combinación, calculará las sumas de quantity y amount.

countrysalespersonqtyTotalamntTotal
United KingdomMeghan252045.72
MexicoMeghan12912.45

Observe que cuando comparamos el resultado con el Ejemplo 2, sólo incluimos los pedidos realizados entre el 7 de abril de 2023 y el 8 de abril de 2023 para el producto 990048006427. Por ejemplo, no hay filas para las ventas de Meghan en Estados Unidos, ya que no ha vendido este producto en esos dos días de abril.

Ejemplo 4: Uso de la cláusula ORDER BY con SUM y GROUP BY

Si también añadimos una cláusula ORDER BY a la consulta que construimos con SUM() y GROUP BY, entonces el motor de la base de datos tendrá que hacer un poco más de trabajo. Añade un paso más a los tres descritos anteriormente; este paso consiste en ordenar los resultados según los criterios especificados en la cláusula ORDER BY.

Por ejemplo, podríamos ordenar los resultados por la suma de amount, referenciándolo por su alias amntTotal. También podríamos especificar la expresión completa SUM(amount):

SELECT 
  country, 
  salesperson, 
  SUM(quantity) AS qtyTotal, 
  SUM(amount) AS amntTotal
FROM orders
GROUP BY country, salesperson
ORDER BY amntTotal DESC;

En este ejemplo, añadimos la cláusula DESC para que los resultados se ordenen de mayor a menor.

countrysalespersonqtyTotalamntTotal
United KingdomMeghan252045.72
United KingdomStephen181012.66
United StatesArthur15914.42
MexicoMeghan12912.45
United StatesMeghan10845.25
New ZealandArthur16842.06
New ZealandStephen14799.45
United StatesStephen12705.5
MexicoArthurNULLNULL

Ejemplo 5: Suma de expresiones

Además de aplicarse a columnas individuales, la función SUM también puede aplicarse a expresiones que devuelven valores numéricos. Supongamos que tenemos una columna unit_price en lugar de tener una columna importe. El importe de la orden sería el resultado de multiplicar quantity por unit_price.

Para que el SQL SUM GROUP BY devuelva una suma de los importes ordenados en este caso, tendremos que aplicar la función SUM() sobre la expresión quantity * unit_price:

SELECT 
  country, 
  salesperson, 
  SUM(quantity) AS qtyTotal,
  SUM(quantity * unit_price) AS amntTotal
FROM orders
GROUP BY country, salesperson;

El resultado de la consulta sería el mismo que en el ejemplo 2:

countrysalespersonqtyTotalamntTotal
United StatesMeghan10845.25
United StatesStephen12705.50
United StatesArthur15914.42
United KingdomStephen181012.65
United KingdomMeghan252045.72
MexicoArthurNULLNULL
MexicoMeghan12912.45
New ZealandStephen14799.45
New ZealandArthur16842.06

El procedimiento realizado por el motor de la base de datos sería un poco diferente. Para cada grupo, primero calcularía el valor de la expresión quantity * unit_price y después calcularía las sumas utilizando los valores calculados.

Ejemplo 6: Valores nulos en la función SUM()

Cuando se utiliza la función SUM() en SQL, NULLs se ignora y no se incluye en el cálculo del total. Si alguna fila de la tabla orders tabla tuviera valores NULL en las columnas quantity o amount, serán ignorados por la función SUM(). La excepción es si todos los valores son NULL para cualquiera de las columnas, en cuyo caso la función SUM() también devolverá NULL.

Esta advertencia afecta a la combinación SUM() y GROUP BY. Si hay algunas combinaciones de los valores de las columnas GROUP BY en las que todos los valores totalizados son NULL, entonces SUM() también devolverá NULL para esa combinación de valores.

En nuestra tabla de pedidos de ejemplo, todas las filas de country='Mexico' y salesperson='Arthur' tienen un valor NULL en cantidad e importe. Por esa razón, el resultado de SUM() y GROUP BY devuelve NULL en la suma de cantidad e importe para country = 'Mexico' y salesperson = 'Arthur'. Sin embargo, ni Arturo ni México son NULL en ninguna de sus otras combinaciones.

Eche un vistazo:

SELECT 
  country, 
  salesperson, 
  SUM(quantity) AS qtyTotal,
  SUM(amount) AS amntTotal
FROM orders
WHERE country = 'Mexico' AND Salesperson = 'Arthur'
GROUP BY country, salesperson;
countrysalespersonqtyTotalamntTotal
MexicoArthurNULLNULL

Si se insertara una nueva fila para country = 'Mexico' y salesperson = 'Arthur' con valores noNULL en quantity y amount, entonces el resto de los valores NULL se ignorarían en el total. Los resultados de SUM() incluirían sólo los valores que no tienen NULLs en las columnas que se están sumando.

Ejemplo 7: Conversión de valores NULL a ceros

Hemos visto que la función SUM() devuelve NULL si todos los valores de la columna sumada son NULL. Si sólo hay un valor que no seaNULL, el resto de los valores NULL se ignoran, es decir, se tratan como si fueran cero.

Esto puede ser difícil de explicar cuando se hace una narración de datos. Queremos evitar que la palabra "NULL" aparezca en un cuadro de resultados donde debería aparecer un número (causando así confusión a nuestro público). En estos casos, es conveniente convertir los valores de NULL en ceros. Para ello, puede utilizar la función COALESCE. Convierte los valores de NULL de una columna en un valor establecido, normalmente cero, aunque pueden utilizarse otros valores.

En nuestro ejemplo, no queremos correr el riesgo de que los valores NULL de quantity o amount provoquen la aparición del texto "NULL" en nuestros resultados. Podemos encerrar estas columnas en la función COALESCE y enviar el resultado de ésta como parámetro de la función SUM():

SELECT 
  country, 
  salesperson, 
  SUM(COALESCE(quantity, 0)) AS qtyTotal,
  SUM(COALESCE(amount, 0)) AS amntTotal
FROM orders
GROUP BY country, salesperson;

De este modo, todos los NULLs de las columnas sumadas aparecerán como ceros.

countrysalespersonqtyTotalamntTotal
United StatesMeghan10845.25
United StatesStephen12705.50
United StatesArthur15914.42
United KingdomStephen181012.65
United KingdomMeghan252045.72
MexicoArthur00.00
MexicoMeghan12912.45
New ZealandStephen14799.45
New ZealandArthur16842.06

Observe que la fila correspondiente a las ventas de Arthur en México muestra ahora 0 en lugar de NULL.

Ejemplo 8: SUM() con condicionales

A veces queremos que la combinación GROUP BY SUM() sólo considere los datos que cumplen ciertas condiciones.

Siguiendo con nuestro ejemplo, supongamos que cada pedido tiene una columna de tipo BIT llamada delivered que indica si el pedido se ha entregado o no. Es posible que queramos que los resultados de nuestras sumas se dividan en dos: un total de productos entregados y un total de productos no entregados. Esto se resuelve utilizando CASE WHEN dentro de la función SUM() para evaluar el contenido de la columna delivered:

SELECT 
  country,
  SUM(CASE 
    WHEN delivered = 1 THEN quantity 
    ELSE 0 END) AS qtyTotalDelivered,
  SUM(CASE 
    WHEN delivered = 0 THEN quantity 
    ELSE 0 END) AS qtyTotalNotDelivered
FROM orders
GROUP BY country;

La sentencia CASE WHEN es similar a la sentencia IF en muchos lenguajes de programación; añade algo de lógica al flujo de nuestra consulta evaluando una condición establecida. La condición se indica después de WHEN. Si la condición se cumple, entonces se devuelve el valor después de THEN. Si la condición no se cumple, se devuelve el valor después de ELSE.

CASE 
    WHEN delivered = 1 THEN quantity 
    ELSE 0 END

En esta expresión, devolvemos la columna quantity para los productos entregados. Para los demás productos, se devuelve 0.

Este es el resultado de la consulta:

countryqtyTotalDeliveredqtyTotalNotDelivered
United States2215
United Kingdom1825
Mexico12NULL
New Zealand1416

Puede obtener más información sobre cómo utilizar CASE WHEN con SUM y GROUP BY en otra sección de nuestro blog.

Practique el Uso de SUM() con GROUP BY en sus Consultas SQL

A lo largo de este artículo, hemos visto ocho ejemplos de cómo combinar SUM() y GROUP BY en consultas SQL. Nuestra tabla orders aunque sólo tiene unas pocas filas, representa situaciones de la vida real.

En tu trabajo, a menudo te encontrarás con situaciones similares a las que hemos presentado, pero tus tablas estarán pobladas con muchas más filas. Entonces tendrás que utilizar todas las variantes posibles de SUM() y GROUP BY para demostrar que los resultados de tus consultas son legítimos.

Aproveche nuestro Ejercicios prácticos de SQL curso y Ejercicio de SQL pista para perfeccionar tus conocimientos de SQL. Recuerda: El aspecto más crítico del trabajo de un analista de datos es que la información que proporcione sea 100% fiable.