Torna all'elenco degli articoli Articoli
Tempo di lettura: 7 minuti

SQL commerciale: Come calcolare la crescita dei ricavi in SQL

Si può usare l'SQL nel mondo degli affari? Certo che sì! Ad esempio, è possibile calcolare la crescita del fatturato in SQL - ecco come.

Chi lavora con i dati sa già che SQL è lo strumento più utilizzato per l'analisi dei dati. Ma in che modo SQL è utile in ambito aziendale? La risposta è ovvia: analizzando i dati aziendali con SQL! Tuttavia, ci sono alcune specificità dei dati aziendali che possono essere complicate se non si è abituati. Queste specificità richiedono anche alcune funzioni SQL che forse non avete ancora utilizzato: le funzioni finestra.

Se non conoscete le funzioni finestra di SQL, vi consiglio di imparare qualcosa su di esse prima di continuare. Questa panoramica sulle funzioni finestra vi fornirà un buon inizio, così come questo articolo sulle funzioni finestra con esempi.

Se avete già una certa dimestichezza con le funzioni finestra e avete bisogno di un rapido ripasso prima di approfondire, il nostro SQL Window Functions Cheat Sheet vi aiuterà a capire gli esempi che vi mostrerò.

Perché calcolare la crescita dei ricavi?

La crescita dei ricavi è un parametro importante per qualsiasi azienda. Che siano realizzate (effettive) o previste, le statistiche di crescita dei ricavi sono alla base della pianificazione aziendale e del processo decisionale. Stipendi, nuovi investimenti, prezzo delle azioni, tutto si basa sulla crescita (o sul declino) dei ricavi.

Tuttavia, calcolare la crescita dei ricavi in SQL non è così semplice. Perché? Perché richiede di ottenere la differenza tra due righe diverse, non tra due colonne diverse. Qualsiasi principiante di SQL è in grado di trovare la differenza tra due colonne. Ma come si fa a sottrarre le righe?

Uso delle funzioni LEAD() e LAG() per calcolare la crescita dei ricavi

Sia LEAD() che LAG() sono funzioni finestra. La funzione LEAD() consente di ottenere dati da una riga successiva e di utilizzarli nella riga corrente. La funzione LAG() è esattamente l'opposto: viene utilizzata per ottenere i dati di una riga precedente.

Prima di proseguire, è necessario familiarizzare con la sintassi di entrambe le funzioni.

Esempio

In questo esempio, si utilizzerà la tabella monthly_revenue. Questa tabella ha le seguenti colonne:

  • id - L'ID del mese e la chiave primaria della tabella.
  • month - Il mese.
  • revenue - L'importo delle entrate.

La tabella contiene le entrate mensili per due anni, 2019 e 2020. È necessario calcolare la crescita mensile delle entrate. Inoltre, per ogni mese, è necessario mostrare il valore delle entrate per lo stesso mese dell'anno successivo.

Prima di scrivere il mio codice, voglio assicurarmi che comprendiate la logica. Una volta compresa, scrivere il proprio codice sarà molto più facile.

La crescita dei ricavi mensili implica una semplice matematica: la sottrazione. È necessario prendere le entrate del mese corrente e sottrarre quelle del mese precedente. Per esempio:

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

Non è possibile calcolare la crescita delle entrate per il 2019-01-31 perché non c'è un periodo precedente con cui confrontarlo. Ma si può fare per il 2019-02-28. Come? È semplice: 1.348.523,26 - 1.237.844,22 = 110.679,04.

Che ne dite di ottenere le entrate di quel mese nell'anno successivo (ad esempio, confrontando gennaio 2019 e gennaio 2020)? Ecco cosa bisogna fare:

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

Supponiamo che i dati abbiano questo aspetto; in qualche modo è necessario saltare 12 righe per ottenere i dati. Per il 2019-01-31, è necessario mostrare il valore corrente, che è 1.237.844,22. Ma bisogna anche ottenere i dati per il 2020-01-31 (1.645.112,22) e inserirli nella colonna accanto alle entrate correnti.

Ora è il momento di scrivere il codice per la risoluzione del 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;

Il codice inizia selezionando le colonne month e revenue; questi dati sono necessari nel risultato. La riga successiva utilizza la funzione LAG() per calcolare la crescita delle entrate rispetto al mese precedente. Si tratta solo di tradurre in codice la logica che vi ho spiegato. Ricordate che LAG() ottiene i dati dalla riga precedente.(Nota: LAG() può restituire i dati da n righe indietro se si utilizza l'argomento opzionale offset, cioè LAG(nome_colonna, n). Se si omette l'argomento offset, viene restituito il valore della riga precedente). Quindi questa riga prende la colonna dei ricavi della riga corrente e la sottrae dal valore dei ricavi della riga precedente; la riga precedente è il ricavo del mese precedente.

Si noti che LAG() è una funzione finestra, quindi è obbligatorio includere la clausola OVER(). Nel nostro OVER(), c'è una clausola ORDER BY che dice che la funzione finestra deve essere eseguita in base al mese, in ordine crescente. In altre parole, partirà dal 2019-01-31 e arriverà fino al 2020-12-31, mese per mese. Ho chiamato questa colonna revenue_growth.

La riga di codice seguente utilizza la funzione LEAD() window. Questa funzione consente di recuperare i dati da una riga successiva. È possibile determinare quante righe si desidera che la funzione "salti", proprio come avviene con LAG(). In questo caso, ho bisogno dei dati a 12 righe dalla riga corrente; ecco perché l'offset 12 è all'interno delle parentesi della funzione. Ancora una volta, abbiamo una clausola OVER() con lo stesso principio di cui sopra: la funzione verrà eseguita in base al mese crescente. Ho chiamato questa colonna next_year_revenue.

Non è poi così difficile, una volta compresa la logica, no? Ecco il risultato:

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

Il valore NULL nella colonna revenue_growth significa che non ci sono dati prima del 2019-31.

Il valore NULL in next_year_revenue significa che non ci sono dati a 12 mesi da quel mese.

Potete trovare altre occasioni per esercitarvi con la funzione LAG() in questo articolo sul calcolo della differenza tra due righe.

Che ne dite di aggiungere qualcosa al risultato precedente? Forse la percentuale di crescita dei ricavi?

Calcolo delle percentuali di crescita dei ricavi

Mostrare la crescita in percentuale è di solito ancora più utile che mostrare i valori assoluti. Ai consigli di amministrazione piace soprattutto pensare in percentuale. Sarebbe molto utile se il vostro report contenesse anche questi dati.

Per ottenere questo risultato, possiamo utilizzare gli stessi dati e lo stesso codice di cui sopra. Basta aggiungere una riga di codice:

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;

Ecco la logica per calcolare la crescita percentuale:

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

Ad esempio:

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

La crescita percentuale dei ricavi per il 2019-02-28 viene calcolata in questo modo:

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

Nel codice precedente, questa è la riga che fa esattamente questo:

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

Probabilmente non c'è bisogno di spiegarlo di nuovo. Avete capito come funziona la funzione LAG() e la matematica alla base del calcolo. Ecco il risultato:

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

Ora che avete imparato quello per cui siete venuti, forse è arrivato il momento di fare qualcosa di più? Ad esempio, alcune query SQL avanzate da utilizzare nell'analisi finanziaria?

Volete lavorare anche sulla vostra crescita professionale?

Penso che sia utile sapere come calcolare la crescita dei ricavi. Come analista di dati, mi è stato spesso chiesto di creare report simili a quello che vi ho mostrato qui. Si tratta di dati importanti che vengono costantemente analizzati nelle aziende. Ora che avete imparato a usare le funzioni LAG() e LEAD(), potrete utilizzarle su qualsiasi tipo di dati. Nel mondo degli affari, avrete molte occasioni per farlo.

Nel caso in cui non abbiate modo di esercitarvi con le funzioni di SQL window, o se volete semplicemente rispolverare le vostre abilità, seguire un corso Window Functions potrebbe essere una buona decisione. E se vi state chiedendo perché, ecco un articolo con la risposta alla vostra domanda.