Retour à la liste des articles Articles
8 minutes de lecture

Business SQL : Comment calculer la croissance des revenus en SQL

Pouvez-vous utiliser SQL dans votre entreprise ? Bien sûr que oui ! Par exemple, vous pouvez calculer la croissance du chiffre d'affaires en SQL - voici comment.

Si vous travaillez avec des données, vous savez déjà que SQL est l'outil le plus utilisé pour l'analyse des données. Mais en quoi SQL est-il utile en entreprise ? La réponse est évidente : analysez les données professionnelles à l'aide de SQL ! Cependant, certaines spécificités des données professionnelles peuvent s'avérer délicates si vous n'en avez pas l'habitude. Ces spécificités font également appel à certaines fonctions SQL que vous n'avez peut-être pas encore utilisées : les fonctions de fenêtre.

Si vous n'êtes pas familier avec les fonctions de fenêtre de SQL, je vous recommande d'en apprendre un peu plus à leur sujet avant de continuer. Cet aperçu des fonctions de fenêtre vous donnera un bon départ, tout comme cet article sur les fonctions de fenêtre avec des exemples.

Si vous connaissez déjà un peu les fonctions de fenêtre et que vous avez besoin d'un rafraîchissement rapide avant de vous lancer, notre aide-mémoire SQL Fonctions de fenêtrage vous aidera à comprendre les exemples que je vais vous montrer.

Pourquoi calculer la croissance du chiffre d'affaires ?

La croissance du chiffre d'affaires est une mesure importante pour toute entreprise. Qu'elles soient réalisées (réelles) ou prévues, les statistiques de croissance du chiffre d'affaires constituent la base de la planification et de la prise de décision. Les salaires, les nouveaux investissements, le prix des actions, tout est basé sur la croissance (ou le déclin) des revenus.

Cependant, calculer la croissance des revenus en SQL n'est pas si facile. Pourquoi ? Parce qu'il faut obtenir la différence entre deux lignes différentes, et non deux colonnes différentes. N'importe quel débutant en SQL peut trouver la différence entre deux colonnes. Mais comment soustraire des lignes ?

Utilisation des fonctions LEAD() et LAG() pour calculer la croissance du chiffre d'affaires

Les fonctions LEAD() et LAG() sont toutes deux des fonctions de fenêtre. La fonction LEAD() vous permet d'obtenir des données d'une ligne ultérieure et de les utiliser dans la ligne actuelle. La fonction LAG() est exactement l'inverse ; vous l'utilisez pour obtenir les données d'une ligne précédente.

Avant d'aller plus loin, vous devez vous familiariser avec la syntaxe des deux fonctions.

Exemple

Dans cet exemple, vous allez utiliser la table monthly_revenue. Ce tableau comporte les colonnes suivantes :

  • id - L'ID du mois et la clé primaire de la table.
  • month - Le mois.
  • revenue - Le montant du revenu.

Le tableau contient les recettes mensuelles pour deux années, 2019 et 2020. Vous devez calculer la croissance mensuelle du revenu. De plus, pour chaque mois, vous devez afficher la valeur du revenu pour le même mois de l'année suivante.

Avant d'écrire mon code, je veux m'assurer que vous comprenez la logique. Une fois que vous l'aurez comprise, il sera beaucoup plus facile d'écrire votre propre code.

La croissance du revenu mensuel fait appel à des mathématiques simples : la soustraction. Vous devez prendre le revenu du mois en cours et déduire le revenu du mois précédent. Par exemple :

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

Vous ne pouvez pas calculer la croissance des revenus pour 2019-01-31 car il n'y a pas de période précédente à laquelle la comparer. Mais vous pouvez le faire pour le 2019-02-28. Comment ? C'est simple : 1 348 523,26 - 1 237 844,22 = 110 679,04.

Et si vous obteniez les recettes de ce mois pour l'année suivante (par exemple, en comparant janvier 2019 et janvier 2020) ? Voici ce que vous devez faire :

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

Supposons que vos données ressemblent à ceci ; vous devez en quelque sorte sauter 12 lignes pour obtenir les données. Pour 2019-01-31, vous devez afficher la valeur actuelle, qui est de 1 237 844,22. Mais vous devez également obtenir les données pour le 2020-01-31 (1 645 112,22) et les placer dans la colonne juste à côté du revenu actuel.

Maintenant, il est temps d'écrire le code de résolution du problème :

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;

Ce code commence par sélectionner les colonnes month et revenu ; vous avez besoin de ces données dans votre résultat. La ligne suivante utilise la fonction LAG() pour calculer la croissance du revenu par rapport au mois précédent. Elle traduit simplement la logique que je vous ai expliquée en un code. N'oubliez pas que LAG() récupère les données de la ligne précédente.(Remarque : LAG() peut renvoyer les données de n lignes en arrière si vous utilisez l'argument de décalage facultatif, c'est-à-dire LAG(nom_colonne, n). Si vous omettez l'argument de décalage, il renvoie la valeur de la ligne précédente). Cette ligne prend donc la colonne des recettes de la ligne actuelle et en déduit la valeur des recettes de la ligne précédente ; la ligne précédente correspond aux recettes du mois précédent.

Notez que LAG() est une fonction fenêtre, il est donc obligatoire d'inclure la clause OVER(). Dans notre OVER(), il y a une clause ORDER BY qui indique que la fonction fenêtre doit être exécutée en fonction du mois, dans l'ordre croissant. En d'autres termes, elle commencera à partir du 2019-01-31 et ira jusqu'au 2020-12-31, mois par mois. J'ai nommé cette colonne revenue_growth.

La ligne de code suivante utilise la fonction de fenêtre LEAD(). N'oubliez pas que cette fonction vous permet d'extraire les données d'une ligne à venir. Vous pouvez déterminer le nombre de lignes que vous souhaitez que la fonction " saute ", tout comme vous pouvez le faire avec LAG(). Dans ce cas, j'ai besoin des données à 12 lignes de la ligne actuelle ; c'est pourquoi le décalage de 12 est à l'intérieur des parenthèses de la fonction. Une fois de plus, nous avons une clause OVER() avec le même principe que ci-dessus : la fonction sera exécutée en fonction du mois croissant. J'ai nommé cette colonne next_year_revenue.

Ce n'est pas si difficile une fois que l'on a compris la logique, n'est-ce pas ? Voici le résultat :

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

La valeur NULL dans la colonne revenue_growth signifie qu'il n'y a pas de données avant 2019-01-31.

La valeur NULL dans la colonne next_year_revenue signifie qu'il n'y a pas de données à 12 mois de ce mois.

Vous trouverez d'autres occasions de mettre en pratique la fonction LAG() dans cet article sur le calcul de la différence entre deux lignes.

Que diriez-vous d'ajouter un petit quelque chose au résultat ci-dessus ? Peut-être le pourcentage de croissance des revenus ?

Calcul des pourcentages de croissance du chiffre d'affaires

La présentation de la croissance en pourcentage est généralement encore plus utile que la présentation des valeurs absolues. Les conseils d'administration aiment particulièrement penser en pourcentages. Il serait très utile que votre rapport contienne également ces données.

Pour obtenir ce résultat, nous pouvons utiliser les mêmes données et le même code que ci-dessus. Nous y ajoutons simplement une ligne de code :

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;

Voici la logique pour calculer le pourcentage de croissance :

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

Par exemple :

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

Le pourcentage de croissance du revenu pour le 2019-02-28 est calculé comme suit :

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

Dans le code ci-dessus, c'est la ligne qui fait exactement cela :

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

Il n'y a probablement pas besoin de l'expliquer à nouveau. Vous comprenez le fonctionnement de la fonction LAG() et les mathématiques qui sous-tendent le calcul. Voici le résultat :

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

Maintenant que vous avez appris ce pour quoi vous êtes venu, il est peut-être temps de faire quelque chose de plus ? Par exemple, des requêtes SQL avancées que vous pourriez utiliser dans l'analyse financière ?

Vous voulez aussi travailler sur votre développement professionnel ?

Je pense qu'il est utile de savoir comment calculer la croissance des revenus. En tant qu'analyste de données, on m'a souvent demandé de créer des rapports semblables à celui que je vous ai montré ici. Il s'agit de données importantes qui sont constamment analysées dans les entreprises. Maintenant que vous avez appris à utiliser les fonctions LAG() et LEAD(), vous êtes en mesure de les utiliser sur tout type de données. Dans le monde des affaires, vous aurez de nombreuses occasions de le faire.

Si vous n'avez pas la possibilité de pratiquer les fonctions de la fenêtre SQL - ou si vous souhaitez simplement rafraîchir vos connaissances - suivre un cours sur Fonctions de fenêtrage pourrait être une bonne décision. Et si vous vous demandez pourquoi, voici un article qui répond à votre question.