Soma Cumulativa no SQL

Este é um post rápido e bastante auto-explicativo, penso que você não terá problemas – se tiver, pode comentar ou mandar um e-mail -, mas com um conteúdo bastante útil: soma cumulativa no SQL!

É útil porque vai te ajudar a entender também como funciona o OVER+_+PARTITION BY, uma ferramenta bastante interessante quando combinada com outras funções. O objetivo aqui é simples, você tem uma tabela e quer adicionar uma coluna com a soma de um campo numérico. Porém, essa coluna deverá ir acumulando valores do campo que está sendo somado.

Primeiro, montamos nossa tabela:

CREATE TABLE base (
Id int,
Nome varchar(50),
Sobrenome varchar(50),
Estado varchar(2),
Gastos decimal,
Data_Compra date
);


INSERT INTO base
VALUES
(152, 'Andre', 'Silva', 'MG', 351.50, '2018-01-22'),
(222, 'Andre', 'Toledo', 'SP', 250.10, '2018-05-15'),
(451, 'Carlos', 'Pinheiro', 'MG', 455.00, '2017-02-05'),
(897, 'Juliana', 'Oliveira', 'MG', 150.50, '2017-03-01'),
(852, 'Maria', 'Lima', 'MG', 325.90,NULL),
(NULL,NULL, 'Pereira', 'MG', 332.59, '2018-05-25'),
(105535, 'Vanessa', 'Costa', 'SP', 241.57, '2017-04-30');

Agora, vamos fazer duas coisas para assimilar o entendimento do conteúdo. Primeiro, vamos criar uma coluna com a soma dos gastos acumulada por estado:

SELECT *,  
        SUM(Gastos) OVER (PARTITION BY Estado order by Id, Estado) AS cum_amt
       FROM base;

E, por fim, vamos criar somente a soma cumulativa de forma geral. Note que aqui não temos como utilizar o PARTITION BY, por isso decidi fazer de outra forma. Uni a tabela com ela mesma, trazendo na sua segunda versão a soma sempre através da linha seguinte:

select t1.id, t1.Gastos, SUM(t2.Gastos) as sum
from base t1
inner join base t2 on t1.id >= t2.id
group by t1.id, t1.Gastos
order by t1.id

Gostou do conteúdo? Se inscreva para receber as novidades! Deixe seu e-mail em INSCREVA-SE na barra à direita, logo abaixo de pesquisar. E, por favor, não deixe de comentar, dar seu feedback e compartilhar com seus amigos. De verdade, isso faz toda a diferença. Você também pode acompanhar mais do meu trabalho seguindo a conta de Twitter @EstatSite ou por alguma das redes que você encontra em Sobre o Estatsite / Contato.

Bons estudos!

Deixe um comentário

O seu endereço de email não será publicado. Campos obrigatórios marcados com *