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

Publicado por Pedro Carvalho

Apaixonado por anlise de dados e Power BI

8 comentários em “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?

    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

Deixe uma resposta

× Como posso te ajudar?
%d blogueiros gostam disto: