Voltar para a lista de artigos Artigos
7 minutos de leitura

SQL empresarial: Como calcular o crescimento da receita em SQL

Você pode usar SQL nos negócios? É claro que você pode! Por exemplo, você pode calcular o crescimento da receita em SQL - aqui está como.

Como alguém que trabalha com dados, você já sabe que SQL é a ferramenta mais utilizada na análise de dados. Mas como o SQL é útil no uso empresarial? Bem, a resposta é óbvia: analisar dados comerciais usando SQL! Entretanto, existem algumas especificidades com dados comerciais que podem ser complicadas se você não estiver acostumado a isso. Estas especificidades também exigem algumas funções SQL que você pode ainda não ter usado: funções de janela.

Se você não está familiarizado com as funções de janela SQL, recomendo que você aprenda um pouco sobre elas antes de continuar. Esta visão geral das funções de janela lhe dará um bom começo, assim como este artigo sobre funções de janela com exemplos.

Se você já está um pouco familiarizado com funções de janela e precisa de uma rápida atualização antes de se aprofundar, nosso SQL Funções de Janela (Window Functions) em SQL Cheat Sheet o ajudará a entender os exemplos que eu lhe mostrarei.

Por que calcular o crescimento da receita?

O crescimento da receita é uma métrica importante em qualquer negócio. Quer seja realizado (real) ou projetado, as estatísticas de crescimento de receita são a base para o planejamento e a tomada de decisão do negócio. Salários, novos investimentos, preço das ações, etc.; tudo é baseado no crescimento (ou declínio) da receita.

Entretanto, calcular o crescimento da receita em SQL não é tão fácil. Por que não? Porque é necessário obter a diferença entre duas filas diferentes, não duas colunas diferentes. Qualquer novato em SQL pode encontrar a diferença entre duas colunas. Mas como subtrair as linhas?

Usando as funções LEAD() e LAG() para calcular o crescimento da receita

Tanto LEAD() quanto LAG() são funções de janela. A função LEAD() permite obter dados de uma linha subseqüente e utilizá-los na linha atual. A função LAG() é exatamente o oposto; você a usa para obter os dados de uma linha anterior.

Antes de continuarmos, você deve se familiarizar com a sintaxe de ambas as funções.

Exemplo

Neste exemplo, você estará usando a tabela monthly_revenue. Esta tabela tem as seguintes colunas:

  • id - A identificação do mês e a chave primária da mesa.
  • month - O mês.
  • revenue - O valor da receita.

A tabela contém a receita mensal para dois anos, 2019 e 2020. Você precisa calcular o crescimento mensal da receita. Além disso, para cada mês, você precisa mostrar o valor da receita para o mesmo mês do ano seguinte.

Antes de escrever meu código, quero ter certeza de que você entendeu a lógica. Uma vez que você a entenda, escrever seu próprio código será muito mais fácil.

O crescimento da receita mensal envolve matemática simples - subtração. Você precisa pegar a receita do mês atual e deduzir a receita do mês anterior. Por exemplo:

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

Você não pode calcular o crescimento da receita para 2019-01-31 porque não há período anterior para compará-la. Mas você pode fazer isso para 2019-02-28. Como? É simples: 1.348.523,26 - 1.237.844,22 = 110.679,04.

Que tal obter a receita desse mês no próximo ano (por exemplo, comparando janeiro de 2019 com janeiro de 2020)? Aqui está o que você precisa fazer:

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

Suponha que seus dados tenham este aspecto; você de alguma forma precisa saltar 12 linhas para obter os dados. Para 2019-01-31, você precisa mostrar o valor atual, que é 1.237.844,22. Mas você também precisa obter os dados para 2020-01-31 (1.645.112,22) e colocá-los na coluna ao lado da receita atual.

Agora, é hora de escrever o código de solução de problemas:

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 começa selecionando as colunas month e a receita; você precisa destes dados em seu resultado. A próxima linha usa a função LAG() para calcular o crescimento da receita em relação ao mês anterior. Ela apenas traduz a lógica que lhe expliquei em um código. Lembre-se, LAG() obtém os dados da linha anterior.(Nota: LAG() pode retornar dados de n linhas se você usar o argumento opcional de offset, ou seja, LAG(column_name, n). Se você omitir o argumento de offset, ele retorna o valor da linha anterior). Então esta linha pega a coluna de receita da linha atual e deduz dela o valor da receita da linha anterior; a linha anterior é a receita do mês anterior.

Note que LAG() é uma função de janela, portanto é obrigatório incluir a cláusula OVER(). Em nosso OVER(), há uma cláusula ORDER BY que diz que a função de janela deve ser executada de acordo com o mês, em ordem ascendente. Em outras palavras, ela começará a partir de 2019-01-31 e irá até 2020-12-31, mês a mês. Eu nomeei esta coluna revenue_growth.

A seguinte linha de código usa a função de janela LEAD(). Lembre-se, esta função permite que você vá buscar os dados de uma próxima linha. Você pode determinar quantas linhas você quer que a função "pule", assim como você pode com LAG(). Neste caso, eu preciso dos dados 12 linhas da linha atual; é por isso que o desvio de 12 linhas está dentro dos parênteses da função. Mais uma vez, temos uma cláusula OVER() com o mesmo princípio do acima: a função será executada de acordo com o mês ascendente. Eu nomeei esta coluna next_year_revenue.

Não é tão difícil assim que você entender a lógica, certo? Aqui está o 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

O valor NULL na coluna revenue_growth significa que não há dados antes de 2019-01-31.

O valor NULL na coluna next_year_revenue significa que não há dados 12 meses a partir desse mês.

Você pode encontrar mais chances de praticar a função LAG() neste artigo sobre o cálculo da diferença entre duas filas.

Que tal adicionar um pouco de algo ao resultado acima? Talvez o percentual de crescimento da receita?

Cálculo da porcentagem de crescimento da receita

Mostrar o crescimento como porcentagem é geralmente ainda mais útil do que mostrar os valores absolutos. Os conselhos de administração gostam especialmente de pensar em porcentagens. Seria muito útil se seu relatório também contivesse esses dados.

Para obter este resultado, podemos usar os mesmos dados e o mesmo código que os anteriores. Adicionamos apenas uma linha de código a ele:

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;

Aqui está a lógica para calcular o crescimento percentual:

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

Por exemplo:

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

O crescimento percentual da receita para 2019-02-28 é calculado desta forma:

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

No código acima, esta é a linha que faz exatamente isso:

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

Provavelmente não há necessidade de explicá-lo novamente. Você entende como funciona a função LAG() e a matemática por trás do cálculo. Aqui está o 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

Agora que você aprendeu o que veio buscar, talvez esteja na hora de algo mais? Por exemplo, algumas consultas SQL avançadas que você poderia usar na análise financeira?

Você também quer trabalhar em seu crescimento profissional?

Acho que é útil saber como calcular o crescimento da receita. Como analista de dados, muitas vezes me pediram para criar relatórios semelhantes ao que lhe mostrei aqui. Estes são dados importantes que são constantemente analisados nos negócios. Agora que você aprendeu a usar as funções LAG() e LEAD(), você é capaz de usá-las em qualquer tipo de dado. Nos negócios, você terá muitas oportunidades para isso.

Caso você não tenha uma maneira de praticar as funções de janela SQL - ou se você quiser apenas aprimorar suas habilidades - tomar um curso Funções de Janela (Window Functions) em SQL pode ser uma boa decisão. E se você estiver se perguntando por quê, aqui está um artigo com a resposta à sua pergunta.