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

7 situaciones de la vida real en las que se necesita un total acumulado y cómo calcularlo en SQL

¿Quieres aprender qué es un total acumulado y cómo calcularlo en SQL? En este artículo, describiré diferentes escenarios de negocio en los que se necesita un total acumulado. También te enseñaré cómo calcular un total acumulado en SQL con la ayuda de las funciones de ventana. ¿Preparado? Vamos allá.

Definición de Total Móvil

Un total acumulado es la suma acumulada de un valor y todos los valores anteriores de la columna.

Por ejemplo, imagina que estás en ventas y almacenas información sobre el número de artículos vendidos en un día concreto. Podría querer calcular un total acumulado, el número total de artículos vendidos hasta una fecha determinada.

A continuación se muestra una tabla con el número de artículos vendidos en un día concreto:

dateno_of_itemsrunning_total
2021-01-0110150
2021-01-021222
2021-01-031537
2021-01-04946
2021-01-052066
2021-01-061581
2021-01-071394
2021-01-0817111
2021-01-0921132
2021-01-1019151
2021-01-1116167
2021-01-1213180

Número de artículos vendidos y total acumulado

La tercera columna es el total calculado. Tenga en cuenta que el valor de la fila actual siempre se incluye en el total acumulado.

Por ejemplo, el 5 de enero de 2021, el total acumulado es 66. Este es el número total de artículos vendidos desde el 01 Ene 2021 hasta el 05 Ene 2021 (incluyendo el 05 Ene 2021). En concreto, el cálculo es 10 + 12 + 15 + 9 + 20 = 66.

Cálculo del total acumulado en SQL

En SQL, el total acumulado se calcula con la ayuda de las funciones de ventana. Esta función especial de SQL puede realizar cálculos complejos con sólo unas pocas líneas de código SQL.

Aquí está la función de ventana para nuestro ejemplo anterior:

SELECT *,
      SUM(no_of_items) OVER(ORDER BY date) AS running_total 
FROM sales

Y aquí está la explicación del código:

  • Esta es una función ventana, denotada con la cláusula OVER.
  • Dentro de la cláusula OVER, hay un ORDER BY. Esto nos indica cómo se ordenan las filas antes de realizar el cálculo. En nuestro caso, las filas están ordenadas por la columna de la fecha.
  • Cuando se utilizan funciones de ventana, cada registro recibe su propio cálculo. Por lo tanto, el resultado se muestra con una columna adicional. No hay filas colapsadas cuando se trabaja con funciones de ventana. Esta es la principal diferencia entre la cláusula FUNCIONES DE VENTANA GROUP BY y la cláusula funciones de ventana en SQL.
  • Dentro de la sentencia OVER, también se puede encontrar la palabra clave PARTITION BY. PARTITION BY agrupa las filas en particiones en las que cada cálculo de la partición se hace por separado. En nuestro ejemplo, las filas no están organizadas en particiones. Por lo tanto, todo el conjunto de datos se trata como un solo grupo.
  • Cuando se trabaja con funciones de ventana, para cada registro de una tabla, se define un marco de ventana dentro del cual se realiza un cálculo específico. Esto se indica con la palabra clave ROW/RANGE dentro de la sentencia OVER. Si no se define esta palabra clave (como en nuestro ejemplo), se toma un valor por defecto para el marco de la ventana. Un marco de ventana por defecto de la fila actual incluye la fila actual y todas las filas anteriores.
  • En nuestro ejemplo, cada registro de la suma total de la tabla se calcula sumando todos los valores anteriores más el actual. Por ejemplo, el total actual para el 05 Ene 2021 es 66. Es la suma de los cuatro valores anteriores (10, 12, 15 y 9) más el valor de la fila actual (20).

Ejemplos de totales corridos

Bien, echemos un vistazo a los escenarios de la vida real en los que se utilizan los totales corridos.

1. Seguimiento de las cuotas planificadas frente a las realizadas

En ventas, cada vendedor debe cumplir con los objetivos para satisfacer los requisitos específicos del trabajo. Del mismo modo, en los sectores de las telecomunicaciones y la banca, cada división debe adquirir un número específico de nuevos clientes en cada trimestre y vender un número específico de productos a los clientes.

La dirección hace un seguimiento de los resultados mediante totales móviles. Cada día se actualiza el total móvil con nuevos datos. Estas cifras suelen evaluarse mensual, trimestral o anualmente.

A continuación se muestra una tabla que hace un seguimiento mensual del número de nuevos préstamos en 2021:

dateplanplan_running_totalrealizationrealization_running_total
2021-01-3160606868
2021-02-287513544112
2021-03-31100235--
2021-04-30100335--
2021-05-31100435--
2021-06-30100535--

Número de nuevos préstamos, planificados vs. realizados

Para el primer semestre de 2021, se ha decidido vender 535 préstamos a los clientes en este periodo. Los planes se hacen para cada mes por separado, y 535 es el objetivo total para estos seis meses.

La dirección hace un seguimiento de las cuotas planificadas frente a las realizadas. Por ahora, hay 112 nuevos préstamos vendidos. La tabla se seguirá actualizando a medida que pase el tiempo.

A continuación se muestra el código SQL que calcula los totales en curso:

SELECT 
      date,
      plan,
      SUM(plan) OVER(order by Date) AS plan_running_total,
      realization,
      SUM(realization) OVER(order by Date) AS realization_running_total
FROM sales;

Al igual que en el ejemplo anterior, se utiliza una función de ventana para calcular el total acumulado. La función ventana se denota con OVER, y dentro de los paréntesis se define el orden de las filas.

La función de agregación utilizada es SUM. Tenemos dos totales en funcionamiento: las cuotas planificadas y las realizadas. Por lo tanto, tenemos dos funciones ventana, y se agregan dos columnas a la tabla.

2. Cálculo de saldos

Los totales corridos también se utilizan cuando se calcula un saldo. Cada vez que se realiza una nueva operación (un pago o una retirada de una cuenta), se actualiza la suma acumulada y se muestra el saldo actual.

A continuación se muestra una tabla de saldos:

datetransactionbalance_amount
2020-12-0150005000
2020-12-03-504950
2020-12-04-1254825
2020-12-05-1854640
2020-12-06-1424498
2020-12-09-3504148
2020-12-10-5603588
2020-12-11-803508
2020-12-12-153493

Importe de la transacción y saldo actual

En la tabla anterior, vemos que la primera transacción se produjo el 01 Dic 2020-12-01, una entrada de 5.000 dólares. El saldo en este día era de 5.000 dólares. Después, el cliente empezó a gastar dinero.

El 03 Dic 2020, el cliente gastó $50 (esta transacción se muestra con un valor negativo). Así, el saldo disminuyó a 4.950 $. Al día siguiente, el saldo se redujo en 125 dólares más, hasta los 4.825 dólares, y así sucesivamente.

El saldo de la cuenta se calcula como un total continuo. Es la suma acumulada de todas las transacciones asociadas a esa cuenta. Con cada nueva transacción, el saldo se actualiza, es decir, se recalcula el total corriente.

Esta es la función de ventana para este ejemplo:

SELECT date,
            transaction,
           SUM(transaction) OVER(order by date) AS balance_amount 
FROM balance;

3. Operaciones de caja

Los totales móviles también se utilizan en las operaciones de caja.

Por ejemplo, cuando un cliente está comprando artículos en una tienda, el cajero escanea los artículos de la cesta. Con cada nuevo artículo escaneado, el total actualizado se muestra en la pantalla. Esto muestra cuánto debe pagar el cliente por los artículos escaneados hasta el momento.

A continuación se muestra un ejemplo de una cesta en proceso de escaneo. Los pañales son el último artículo escaneado. Hasta ahora, el cliente tiene que pagar 19,70 EUR. El champú aún no se ha procesado, por lo que su precio aún no se ha calculado en el total de la cesta:

productdatequantityprice(EUR)running_total
bread2021-02-05 8:01:1011.21.2
milk2021-02-05 8:02:02112.2
apple2021-02-05 8:02:3022.54.7
icecream2021-02-05 8:03:01226.7
diapers2021-02-05 8:03:1011319.7
shampoo14-

Caja registradora: escaneo de productos

Esta es casi la misma función de ventana que en el ejemplo anterior (sólo difieren los nombres de las tablas y las columnas):

SELECT 
       *,
      SUM(price) OVER(order by date) as running_total 
FROM cash_register;

Así, cada vez que el cajero escanea un artículo, la suma acumulada se actualiza. Con cada escaneo, el cajero sabe cuánto tiene que pagar el cliente hasta el momento.

4. Contar la ingesta diaria de calorías

Si quiere perder peso, puede utilizar un total acumulado para calcular su consumo diario de calorías. Cada día, empezaría el recuento de calorías en cero y luego actualizaría el total en función de lo que coma y de la cantidad que ingiera.

A continuación se muestra el recuento de calorías de un día:

hoursfoodquantitycaloriesrunning_total
8:30eggs2150150
8:30bread170220
8:30milk1105325
8:30butter140365
10:30banana1105470
11:30apple190560
13:30bread2150710
13:30meat13501060
13:30soup1801140
13:30salad1301170
16:00icecream12501420
17:00cake13201740
20:00sandwich13002040

El total actual se actualiza cada vez que comes algo. Así, siempre sabrá cuánto ha comido y cuánto más puede comer ese día. Este enfoque se llama dieta de recuento de calorías, que es una opción popular.

Aquí está el código que calcula el total de la carrera:

SELECT calorie_intake.*,
      SUM(calories) OVER(ORDER BY hours) AS running_total
FROM calorie_intake;

Revisemos algunos otros escenarios en los que se utilizan los totales corridos. Tenga en cuenta que las funciones de la ventana que calculan los totales de carrera siguen siendo en su mayoría las mismas. Por lo tanto, a partir de ahora, explicaré brevemente los ejemplos sin incluir el código SQL.

5. Casos confirmados de COVID-19

Cada país recoge información sobre el número total de casos confirmados de COVID-19, muertes y casos curados cada día. Con esta nueva información, se actualizan los totales en curso para que cada país sepa cuántos casos confirmados, muertes y casos curados ha tenido hasta el momento, desde el inicio de la pandemia hasta ahora.

Para más detalles, consulte cómo se calcula el total corriente utilizando los datos de John Hopkins: cómo analizar los datos de COVID-19.

6. Usuarios registrados de una aplicación móvil

Los propietarios de aplicaciones móviles suelen querer ver la suma acumulada de los nuevos usuarios registrados y las instalaciones/desinstalaciones que se han realizado en el último mes, trimestre y/o año. También en este caso, se pueden utilizar los totales acumulados para obtener una mejor visión. Estas estadísticas indican a los propietarios cómo ha sido recibida la aplicación o una característica específica y cómo desarrollar el producto en el futuro.

Del mismo modo, si se gestiona un sitio web, una de las métricas más importantes a seguir es el número total de páginas vistas o visitas. Esta información suele recogerse diariamente. Al calcular el total acumulado, se puede ver cómo se comporta la suma acumulada a lo largo del tiempo y cómo se compara con los totales acumulados en el pasado.

7. Programas de fidelización de líneas aéreas

Este concepto es probablemente bien conocido por quienes vuelan con frecuencia. Con cada vuelo, se acumulan puntos. Una vez que se acumula un determinado número de puntos, se obtienen descuentos y/o recompensas.

Para calcular el número total de puntos que tiene en su cuenta, se utiliza un total acumulado. Cada vez que compra un billete, el total se actualiza y sus puntos aumentan.

Resumen

En este artículo, he mostrado cómo se utilizan los totales acumulados en diferentes escenarios. Como ha aprendido, los totales acumulados tienen muchas aplicaciones.

Las funciones de ventana de SQL permiten calcular los totales acumulados con relativa facilidad y con sólo unas pocas líneas de código. Las funciones de ventana se utilizan cuando se trata de cálculos complejos. Una vez que aprendas la sintaxis, escribirás un código más limpio y comprensible.

Aunque sólo he explicado cómo utilizar las funciones ventana para los cálculos de totales corridos, las funciones ventana se utilizan ampliamente para una gran variedad de cálculos. En este artículo con ejemplos de funciones ventana, puedes aprender otras formas de utilizar las funciones ventana.

También ofrecemos un gran curso interactivo en Funciones de ventana con muchos ejemplos. Si quieres profundizar en las funciones de ventana, te recomiendo encarecidamente que sigas este curso. Ofrece muchos ejercicios para practicar, lo cual es importante cuando se adquieren nuevas habilidades de SQL.