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

SQL para empresas: Cómo calcular el crecimiento de los ingresos en SQL

¿Se puede utilizar SQL en la empresa? Por supuesto que sí. Por ejemplo, puedes calcular el crecimiento de los ingresos con SQL.

Como alguien que trabaja con datos, ya sabe que SQL es la herramienta más utilizada en el análisis de datos. Pero, ¿cómo es útil SQL en el uso empresarial? Bueno, la respuesta es obvia: ¡analizar los datos empresariales con SQL! Sin embargo, hay algunas especificidades con los datos empresariales que pueden ser complicadas si no estás acostumbrado. Estas especificidades también requieren algunas funciones SQL que quizás no hayas utilizado todavía: las funciones de ventana.

Si no estás familiarizado con las funciones de ventana de SQL, te recomiendo que aprendas un poco sobre ellas antes de continuar. Este resumen de las funciones de ventana te dará un buen comienzo, al igual que este artículo sobre las funciones de ventana con ejemplos.

Si ya está algo familiarizado con las funciones de ventana y necesita un rápido repaso antes de profundizar, nuestra hoja de trucos de SQL Funciones de ventana le ayudará a entender los ejemplos que le mostraré.

¿Por qué calcular el crecimiento de los ingresos?

El crecimiento de los ingresos es una métrica importante en cualquier negocio. Ya sea realizado (real) o proyectado, las estadísticas de crecimiento de los ingresos son la base para la planificación empresarial y la toma de decisiones. Los salarios, las nuevas inversiones, el precio de las acciones, lo que sea; todo se basa en el crecimiento (o la disminución) de los ingresos.

Sin embargo, calcular el crecimiento de los ingresos en SQL no es tan fácil. ¿Por qué no lo es? Porque requiere obtener la diferencia entre dos filas diferentes, no dos columnas diferentes. Cualquier novato en SQL puede encontrar la diferencia entre dos columnas. Pero, ¿cómo se restan las filas?

Uso de las funciones LEAD() y LAG() para calcular el crecimiento de los ingresos

Tanto LEAD() como LAG() son funciones de ventana. La función LEAD() le permite obtener datos de una fila posterior y utilizarlos en la fila actual. La función LAG() es exactamente lo contrario; se utiliza para obtener los datos de una fila anterior.

Antes de seguir adelante, debes familiarizarte con la sintaxis de ambas funciones.

Ejemplo

En este ejemplo, utilizarás la tabla monthly_revenue. Esta tabla tiene las siguientes columnas:

  • id - El ID del mes y la clave primaria de la tabla.
  • month - El mes.
  • revenue - El importe de los ingresos.

La tabla contiene los ingresos mensuales de dos años, 2019 y 2020. Es necesario calcular el crecimiento mensual de los ingresos. Además, para cada mes, necesita mostrar el valor de los ingresos para el mismo mes del año siguiente.

Antes de escribir mi código, quiero asegurarme de que entiendes la lógica. Una vez que la entiendas, escribir tu propio código será mucho más fácil.

El crecimiento mensual de los ingresos implica una simple matemática: la sustracción. Usted necesita tomar los ingresos del mes actual y deducir los ingresos del mes anterior. Por ejemplo:

monthrevenue
2019-01-311,237,844.22
2019-02-281,348,523.26

No puedes calcular el crecimiento de los ingresos para el 2019-01-31 porque no hay un periodo anterior con el que compararlo. Pero puedes hacerlo para el 2019-02-28. ¿Cómo? Es sencillo: 1.348.523,26 - 1.237.844,22 = 110.679,04.

¿Qué tal si obtienes los ingresos de ese mes en el año siguiente (por ejemplo, comparando enero de 2019 y enero de 2020)? Esto es lo que tienes que hacer:

monthrevenue
2019-01-311,237,844.22
2019-02-281,348,523.26
2019-03-311,028,423.12
2019-04-301,567,213.49
2019-05-312,108,669.68
2019-06-301,984,632.44
2019-07-31224,557.74
2019-08-312,249,995.11
2019-09-302,104,567.63
2019-10-312,008,412.00
2019-11-302,331,114.50
2019-12-311,978,412.62
2020-01-311,645,112.22

Suponga que sus datos se ven así; de alguna manera necesita saltar 12 filas para obtener los datos. Para el 2019-01-31, necesita mostrar el valor actual, que es 1.237.844,22. Pero también necesitas obtener los datos para el 2020-01-31 (1,645,112.22) y ponerlos en la columna justo al lado de los ingresos actuales.

Ahora, es el momento de escribir el código para resolver el problema:

SELECT	month,
		revenue,
		revenue - LAG (revenue) OVER (ORDER BY month ASC) AS revenue_growth,
		LEAD (revenue, 12) OVER (ORDER BY month ASC) AS next_year_revenue
FROM monthly_revenue;

Este código comienza seleccionando las columnas month e ingresos; necesitas estos datos en tu resultado. La siguiente línea utiliza la función LAG() para calcular el crecimiento de los ingresos con respecto al mes anterior. Sólo traduce la lógica que te he explicado en un código. Recuerda que LAG() obtiene los datos de la fila anterior.(Nota: LAG() puede devolver los datos de n filas atrás si utiliza el argumento opcional de desplazamiento, es decir, LAG(nombre_columna, n). Si omite el argumento de desplazamiento, devuelve el valor de la fila anterior). Así, esta línea toma la columna de ingresos de la fila actual y le resta el valor de los ingresos de la fila anterior; la fila anterior es el ingreso del mes anterior.

Tenga en cuenta que LAG() es una función de ventana, por lo que es obligatorio incluir la cláusula OVER(). En nuestro OVER(), hay una cláusula ORDER BY que dice que la función ventana debe realizarse según el mes, en orden ascendente. Es decir, empezará desde el 2019-01-31 y llegará hasta el 2020-12-31, mes a mes. He llamado a esta columna revenue_growth.

La siguiente línea de código utiliza la función de ventana LEAD(). Recuerda que esta función te permite obtener los datos de una fila próxima. Puedes determinar cuántas filas quieres que "salte" la función, igual que con LAG(). En este caso, necesito los datos a 12 filas de la fila actual; por eso el desplazamiento de 12 está dentro del paréntesis de la función. Una vez más, tenemos una cláusula OVER() con el mismo principio que el anterior: la función se realizará según el mes ascendente. He llamado a esta columna next_year_revenue.

No es tan difícil una vez que se entiende la lógica, ¿verdad? Este es el resultado:

monthrevenuerevenue_growthnext_year_revenue
2019-01-311,237,844.22NULL1,645,112.22
2019-02-281,348,523.26110,679.041,025,411.77
2019-03-311,028,423.12-320,100.141,331,224.45
2019-04-301,567,213.49538,790.371,812,225.92
2019-05-312,108,669.68541,456.191,945,331.62
2019-06-301,984,632.44-124,037.242,592,333.88
2019-07-31224,557.74-1,760,074.702,108,496.66
2019-08-312,249,995.112,025,437.372,512,367.31
2019-09-302,104,567.63-145,427.482,662,398.45
2019-10-312,008,412.00-96,155.632,925,568.13
2019-11-302,331,114.50322,702.503,108,469.22
2019-12-311,978,412.62-352,701.883,009,964.39
2020-01-311,645,112.22-333,300.40NULL
2020-02-291,025,411.77-619,700.45NULL
2020-03-311,331,224.45305,812.68NULL
2020-04-301,812,225.92481,001.47NULL
2020-05-311,945,331.62133,105.70NULL
2020-06-302,592,333.88647,002.26NULL
2020-07-312,108,496.66-483,837.22NULL
2020-08-312,512,367.31403,870.65NULL
2020-09-302,662,398.45150,031.14NULL
2020-10-312,925,568.13263,169.68NULL
2020-11-303,108,469.22182,901.09NULL
2020-12-313,009,964.39-98,504.83NULL

El valor NULL en la columna revenue_growth significa que no hay datos antes del 2019-01-31.

El valor NULL en next_year_revenue significa que no hay datos a 12 meses de ese mes.

Puedes encontrar más posibilidades de practicar la función LAG() en este artículo sobre el cálculo de la diferencia entre dos filas.

¿Qué tal si añades algo al resultado anterior? ¿Tal vez el porcentaje de crecimiento de los ingresos?

Cálculo de los porcentajes de crecimiento de los ingresos

Mostrar el crecimiento en forma de porcentaje suele ser incluso más útil que mostrar los valores absolutos. A los consejos de administración les gusta especialmente pensar en porcentajes. Sería muy útil que su informe contuviera también estos datos.

Para obtener este resultado, podemos utilizar los mismos datos y el mismo código de arriba. Sólo le añadimos una línea de código:

SELECT	month,
		revenue,
		revenue - LAG (revenue) OVER (ORDER BY month ASC) AS revenue_growth,
		(revenue - LAG (revenue) OVER (ORDER BY month ASC))/LAG (revenue) OVER (ORDER BY month ASC)*100 AS revenue_percentage_growth,
		LEAD (revenue, 12) OVER (ORDER BY month ASC) AS next_year_revenue
FROM monthly_revenue;

Esta es la lógica para calcular el crecimiento porcentual:

(current month revenue - previous month revenue)/previous month revenue * 100. 

Por ejemplo:

monthrevenue
2019-01-311,237,844.22
2019-02-281,348,523.26

El porcentaje de crecimiento de los ingresos para 2019-02-28 se calcula así:

(1,348,523.26 - 1,237,844.22)/1,237,844.22 * 100 = 8.94%.

En el código anterior, esta es la línea que hace exactamente eso:

(revenue - LAG (revenue) OVER (ORDER BY month ASC))/LAG (revenue) OVER (ORDER BY month ASC)*100 AS revenue_percentage_growth. 

Probablemente no sea necesario explicarlo de nuevo. Usted entiende cómo funciona la función LAG() y la matemática detrás del cálculo. Este es el resultado:

monthrevenuerevenue_growthrevenue_percentage_growthnext_year_revenue
2019-01-311,237,844.22NULLNULL1,645,112.22
2019-02-281,348,523.26110,679.048.941,025,411.77
2019-03-311,028,423.12-320,100.14-23.741,331,224.45
2019-04-301,567,213.49538,790.3752.391,812,225.92
2019-05-312,108,669.68541,456.1934.551,945,331.62
2019-06-301,984,632.44-124,037.24-5.882,592,333.88
2019-07-31224,557.74-1,760,074.70-88.692,108,496.66
2019-08-312,249,995.112,025,437.37901.972,512,367.31
2019-09-302,104,567.63-145,427.48-6.462,662,398.45
2019-10-312,008,412.00-96,155.63-4.572,925,568.13
2019-11-302,331,114.50322,702.5016.073,108,469.22
2019-12-311,978,412.62-352,701.88-15.133,009,964.39
2020-01-311,645,112.22-333,300.40-16.85NULL
2020-02-291,025,411.77-619,700.45-37.67NULL
2020-03-311,331,224.45305,812.6829.82NULL
2020-04-301,812,225.92481,001.4736.13NULL
2020-05-311,945,331.62133,105.707.34NULL
2020-06-302,592,333.88647,002.2633.26NULL
2020-07-312,108,496.66-483,837.22-18.66NULL
2020-08-312,512,367.31403,870.6519.15NULL
2020-09-302,662,398.45150,031.145.97NULL
2020-10-312,925,568.13263,169.689.88NULL
2020-11-303,108,469.22182,901.096.25NULL
2020-12-313,009,964.39-98,504.83-3.17NULL

Ahora que has aprendido lo que viniste a buscar, ¿quizás sea el momento de hacer algo más? Por ejemplo, ¿algunas consultas SQL avanzadas que puedas utilizar en el análisis financiero?

¿Quieres trabajar también en tu crecimiento profesional?

Creo que es útil saber cómo calcular el crecimiento de los ingresos. Como analista de datos, a menudo me piden que cree informes similares a los que te he mostrado aquí. Son datos importantes que se analizan constantemente en las empresas. Ahora que has aprendido a utilizar las funciones LAG() y LEAD(), podrás utilizarlas en cualquier tipo de datos. En los negocios, tendrás muchas oportunidades para ello.

En caso de que no tengas una forma de practicar las funciones de ventana de SQL - o si simplemente quieres repasar tus conocimientos - tomar un curso de Funciones de ventana puede ser una buena decisión. Y si te preguntas por qué, aquí tienes un artículo con la respuesta a tu pregunta.