1
resposta

Power BI - Soma Cumulativa com Range por linha

Tenho uma base de contratos. Fiz a tabela ficar no formato onde contém cada linha a quantidade de produtos que o cliente deve comprar por mes, replicando as linhas desde o inicio do contrato até o fim. Portanto ela esta com as seguintes colunas: ContractID, StartDate, EndDate, Product, Date (aqui fica o ultimo dia do mes), Quantity. Ela contém outras colunas, porém acredito que não impactam no caso. Quando eu crio a Matrix para trazer a quantidade de produto por mes, funciona perfeitamente. Porém quero realizar uma somatória cumulativa mensal, onde ele respeita o incio e fim do contrato. A matrix contém produto na linha, mes na coluna. Filtros: Contract ID e Product. Tentei utilizar Calculate com filter ALL da tabela. Porém ele nunca respeita o Range do contrato, e caso eu altere a formula para respeitar o range, ele desconsidera a quantidade por contrato. Poderiam me ajudar com isso?

1 resposta

Olá, Ahmad!

Sua pergunta é excelente e aborda um dos cenários mais comuns e desafiadores no DAX: a soma cumulativa com filtros dinâmicos.

O que você está enfrentando é uma questão sobre como o CALCULATE e o FILTER interagem. A função ALL remove os filtros do contexto, e é por isso que sua soma não respeita o intervalo do contrato. Para resolver isso, você precisa criar uma medida que some os valores dentro de um contexto de datas, mas que também considere o intervalo de cada contrato.

A solução mais elegante e correta para esse caso é usar CALCULATE com uma função de filtro de tempo, como DATESBETWEEN, ou com uma lógica que combine FILTER com a coluna de datas do seu modelo.

Aqui está uma sugestão de medida DAX que deve resolver o seu problema:

Soma Cumulativa =
CALCULATE(
    SUM('SuaTabela'[Quantity]),
    FILTER(
        ALL('SuaTabela'),
        'SuaTabela'[Date] <= MAX('SuaTabela'[Date]) &&
        'SuaTabela'[Date] >= 'SuaTabela'[StartDate]
    )
)

Explicação da medida:

CALCULATE(SUM('SuaTabela'[Quantity])): Esta é a base da sua medida. Ela vai somar a quantidade de produtos.

FILTER(ALL('SuaTabela'), ...): O FILTER é a parte mágica. Ele vai iterar sobre a tabela inteira (removendo o filtro de tempo do contexto com ALL), mas vai manter apenas as linhas que satisfazem as condições que você definir.

'SuaTabela'[Date] <= MAX('SuaTabela'[Date]): Esta condição garante a soma cumulativa. Ela só soma os meses que são menores ou iguais ao mês que está sendo exibido na matriz.

'SuaTabela'[Date] >= 'SuaTabela'[StartDate]: Esta é a condição que resolve o seu problema. Ela garante que a soma só comece a partir da data de início do contrato.

Com essa medida, o Power BI vai respeitar os filtros da matriz (produto e ID do contrato) e, ao mesmo tempo, calcular a soma cumulativa para o período de cada contrato.

Espero que essa solução te ajude! Se precisar de mais ajustes, pode me avisar.