Clique no banner para conhecer e adquirir o meu treinamento de Bancos de Dados no Azure

SQL Server – Como criar uma AutoSoma (igual do Excel) utilizando Window functions (Running totals)

Visualizações: 3.397 views
Tempo de Leitura: 4 minutos

OlĂ¡ pessoal,
Como vocĂªs estĂ£o ?

Hoje vou apresentar um recurso interessante do SQL Server e que muita gente nĂ£o conhece, que Ă© o uso de Window functions para realizar cĂ¡lculos cumulativos em um result set no SQL Server, semelhantes ao recurso de Auto Soma do Excel.

Essa necessidade surgiu para mim atravĂ©s de uma solicitaĂ§Ă£o similar Ă  que vou apresentar nesse post, onde temos uma base de vendas com data e quero selecionar os meses onde a quantidade de vendas acumulada do ano foi menor que 40. Caso esse valor seja atingido durante o mĂªs, esse mĂªs nĂ£o deve ser selecionado.

Para chegar a essa informaĂ§Ă£o, pensei em agrupar os dados por mĂªs e criar uma soma acumulativa da quantidade de vendas. Com uma massa de dados pequena, podemos criar um loop WHILE para percorrer todas as linhas da tabela, recuperar a quantidade daquela linha, somar numa variĂ¡vel e atualizar novamente esse registro pra fazer a soma, mas quando aplicamos isso numa tabela com milhões de registros, esse processo pode demorar horas para processar.

Caso vocĂª queira conhecer mais algumas formas diferentes de agrupar dados, acesse o postSQL Server – Agrupando dados utilizando ROLLUP, CUBE e GROUPING SETS.

Base de Testes

Utilize esse script para montar a base de testes para esse post.

Exemplo de tabela de Vendas populada:

Implementando o recurso de AutoSoma no SQL Server

Para implementar o recurso de AutoSoma no SQL Server, vamos utilizar a funĂ§Ă£o de agregaĂ§Ă£o SUM() em conjunto com uma Window function, alĂ©m de alguns parĂ¢metros especialmente criados para essa necessidade.

Caso vocĂª queira implementar isso utilizando a soluĂ§Ă£o do WHILE que mencionei acima, vocĂª pode fazer da forma que demonstrei logo abaixo. Precisei fazer algo parecido em uma tabela de 1.4 milhões de registros e pelos meus cĂ¡lculos, ia demorar algumas horas sĂ³ para processar isso, o que acabou me fazendo buscar uma nova soluĂ§Ă£o.

Exemplo de tabela de Vendas agrupada populada:

Para fazer isso de forma muito mais rĂ¡pida e prĂ¡tica, vamos utilizar uma funĂ§Ă£o de agregaĂ§Ă£o e Window function. No exemplo que dei acima, em uma tabela de 1.4 milhões de registros (jĂ¡ agrupados), essa query demorou 8 segundos para processar.

Resultado:

É isso aí, pessoal.
Espero que vocĂªs tenham gostado desse post.

Abraço!

SQL Server – Como criar uma AutoSoma autosum (igual do Excel) like excel excel-like utilizando Window functions running totals running totals

SQL Server – Como criar uma AutoSoma autosum (igual do Excel) like excel excel-like utilizando Window functions running totals running totals