Power BI DAX Total Acumulado

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.

total acumulado

E como fazer isso no Power BI usando DAX?

Acumulado com Gaps

Normalmente criamos uma medida assim:

max data fato

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.

max data calendario

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.

o gráfico avança no futuro

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:

medida com IF funcionando lindamente =)

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

fato
dimensão

Published by Pedro Carvalho

Apaixonado por análise de dados e Power BI

11 thoughts on “Power BI DAX Total Acumulado

  1. 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?

    Like

    1. 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

      Like

  2. 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?

    Like

  3. 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])
    )
    )

    Like

  4. Passei uma semana procurando a solução para o problema em sites gringos… e achei por aqui! Muito obrigado, cara; salvou demais.

    Like

Deixe uma resposta

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s

%d bloggers like this: