O que é Total Acumulado, ou Running Totals? Total Acumulado é a soma acumulada ao longo de um tempo, ou de alguma outra coluna que possa ser colocada em ordem.
No caso da nossa imagem abaixo é o acumulado de itemValor ao longo da dataItem.

E como fazer isso no Power BI usando DAX?
Acumulado com Gaps
Normalmente criamos uma medida assim:

Se olharmos assim numa tabela, parece que deu certo.

Porém, observe as datas, perceba que no período 1 temos gaps, enquanto que no período 2 não temos gaps (vai do dia 1 ao dia 20 direto, sem faltas). Se colocarmos isso num gráfico de linha fica mais fácil de perceber.

O problema com essa medida é que ela gera esses gaps. Isso porque nas datas que não temos dados na fato ela retorna blank, gerando esses gaps, isso acontece porque não há interseção entre datas na dimensão calendário com essas mesmas datas na fato.
E como resolver isso?
Acumulado sem Gaps, mas com Data Futura
Pra resolver o problema dos gaps, podemos ajustar a medida simplesmente alterando a variável de DATACORTE pra utilizar a data da dimensão calendário e não mais da fato.

O problema é que isso vai gerar valores futuros, assim:

Perceba que agora não temos mais gaps, mas os valores continuaram a serem exibidos em datas futuras. Devia ter parado ali em 20-01, mas continuou, se olharmos num gráfico de linha fica mais fácil de perceber.

E como fazer pra resolver isso?
Acumulado com IF
O jeito mais fácil de resolver essa questão é com um bom e velho IF. A medida fica assim:
Nesse caso precisamos adicionar uma variável nova, que é a vDATACORTE, que diz pra gente até que data tem dado pra ser exibido.
Daí no IF é verificado se a dataContexto é menor ou igual a DataCorte, portanto quando a data do contexto for dia 21-01, que é uma data que já não tem mais dados, o que vai ser retornado é apenas o valor da medida [Amount], que vai ser BLANK() já que na fato não temos mais dados pra serem exibidos nessas datas.
Colocar [Amount] ali na condição do else é importante pra exibir os valores de [Amount] nos totalizadores (headers, sub-totals, essas coisas). Vamos ver como fica na matriz:

Vamos ver como fica o resultado no gráfico de linha:

Pronto! Esse é o resultado que estávamos buscando! Existem outras formas de realizar esse acumulado, eu sei de pelo menos mais outras duas, mas que são mais complexas e fazem uso de coluna calculada adicionada ao modelo, portanto, vou preferir não falar delas aqui também pra não extender mais o post.
Se esse post te ajudou de alguma forma, compartilha! 🙂
O Modelo e a Base de Dados


Muito Bom Obrigado !
LikeLike
Ola poderia me ajudar?
fiz um filtro similar com a mesma função onde seleciono o mês e ele me da o acumulado do mesmo!
CALCULATE([soma_vendas_diaria], FILTER(ALLSELECTED(‘TB-GLOBAL-DATA’), ‘TB-GLOBAL-DATA'[data_global]<=MAX('TB-GLOBAL-DATA'[data_global])))
Problema é que preciso mostrar o acumulado do Mês passado e como posso fazer isso em outra medida?
LikeLike
Fala Pedro, as coisas andam corridas por aqui, mas assim que der um tempo te respondo! Valeu!
LikeLike
Você precisa criar uma medida de [soma_vendas_diaria] para o mes anterior, e depois utilizar ela na mesma lógica que explico no post para o acumulado.
Uma dificuldade que você pode encontrar no dax acumulado para o mes anterior é a variavel de data de corte, que pode ser que precise ser ajustada, aí vai depender de como você quer ver seus dados.
Eu fiz assim:
AMOUNT PM =
// PM = PREVIOUS MONTH, MES ANTERIOR
CALCULATE(
[AMOUNT],
DATEADD( dDate[Date], -1, MONTH )
)
AMOUNT PM ACUMULADO COM IF =
// DATAMAXIMA DE QUANDO TEM VALOR NA MEDIDA
VAR vDATACORTE =
CALCULATE(
MAX( dDate[Date] ),
FILTER(
ADDCOLUMNS(
VALUES( dDate[Date] ),
“value”, [AMOUNT PM]
) , [value] BLANK()
)
)
// DATA DO CONTEXTO
VAR vDATACONTEXTO = MAX( dDate[Date] )
VAR vRESULT =
IF(
// SE A DATA DO CONTEXTO FOR MENOR OU IGUAL A DATA DE CORTE
vDATACONTEXTO <= vDATACORTE,
// RETORNA A TABELA DE DATAINPUT INTEIRA, E REDUZ ELA DE FORMA QUE MOSTRE APENAS AS DATAS MENORES OU IGUAL A DATA DO CONTEXTO
// DEPOIS REALIZA A AGREGAÇÃO DO AMOUNT NESSA TABELA DO FILTER
CALCULATE(
[AMOUNT PM],
FILTER(
ALLSELECTED( dDate[Date] ),
dDate[Date] <= vDATACONTEXTO
)
), [AMOUNT PM]
)
RETURN vRESULT
LikeLike
Excelente post, era exatamente o que eu estava precisando.
Parabéns e muito obrigado!
LikeLike
É possível fazer um acumulado com Coluna ao invés de Medida ?
LikeLike
Por que você desejaria fazer um acumulado por coluna calculada ao invés de medida? Qual objetivo?
LikeLike
Boa tarde!
Estou com uma dúvida similar!
Fiz um consolidado, onde vejos GAPs para uma meta (real x meta)! Tudo feito com “medidas” no power BI!
Como consigo ver quantos itens estão acima e abaixo da meta numa forma consolidada?
LikeLike
Oi Pedro! Tudo bem?
No meu caso, tenho uma base de dados que vai de 2018 a 2021 com custos diários. Consegui acumulá-los com base no seu artigo, mas quando realizo um filtro, por exemplo, 2019, os valores em 01/01/2019 partem dos custos acumulados desde o início da série em 2018. Preciso que eles partam do “zero”. Consegue me ajudar?
Esse é o código da minha medida:
Valor Projetado Acumulado =
CALCULATE(
SUM(‘LCC Projetada'[Valor Projetado]),
FILTER(
‘Calendário’,
‘Calendário'[Date] <= MAX('Calendário'[Date])
)
)
LikeLike
Passei uma semana procurando a solução para o problema em sites gringos… e achei por aqui! Muito obrigado, cara; salvou demais.
LikeLike