Minha matriz está fazendo cálculos errados no PowerBI. Como resolver? (dica avançada de DAX)

Hey! É o Edwin aqui.

Hoje vim compartilhar com vocês um problema que tive recentemente ao realizar operações utilizando o visual de matriz no PowerBI, o qual, em um contexto, a conta fazia sentido, mas em uma hierarquia diferente já não fazia. Iremos aprender a manipular a função ISINSCOPE() do DAX.

Quer ficar fera nessa função? Vem comigo! 🚀

O problema

Um cliente meu gostaria de visualizar no PowerBI o cálculo de comissionamento de vendas feitas por seus parceiros comerciais. Uma porcentagem da venda é repassada ao vendedor de acordo com algumas regras, tais como a taxa negativa negociada com o cliente.

Vou dar o exemplo de uma venda:

Valor da Venda: R$10.000

Desconto dado na venda: 0,3%

Taxa ao vendedor por venda: 1%

Taxa efetiva (Taxa do vendedor – Desconto dado na venda): 0,7% ou R$70

No exemplo acima vemos que o cálculo é relativamente simples e poderia ser facilmente transposto em uma tabela:

Todos os valores acima foram preenchidos manualmente e os cálculos deveriam obedecer a fórmula acima. Então vamos colocar no PowerBI no visual Matriz obedecendo a seguinte hierarquia:

Data (mês/ano) -> Parceiro -> Produto -> Cliente

As medidas são as seguintes:

Soma valor venda = SUM(Tabela1[Valor venda])

Soma desconto dado = SUM(Tabela1[Desconto dado na venda])

Soma taxa ao vendedor = SUM(Tabela1[Taxa ao vendedor por venda])

Result Taxa efetiva = [Soma taxa ao vendedor] – [Soma desconto dado]

Valor de repasse = [Soma valor venda] * [Result Taxa efetiva]

Vamos analisar a venda à KM Transportes feita pelo Alan em março de 2021.

Podemos ver que os cálculos a nível de Cliente estão corretos. Mas repare o valor total do produto Light:

Como assim 280 + 100 é igual a 810 ? 😨

Bem, o entendimento de cálculo em matrizes no PowerBI é um pouco diferente. Apesar de nosso senso comum entender que os valores percentuais não devem ser somados ao subir a hierarquia, a soma é feita assim mesmo, o que pode confundir a pessoa que irá utilizar o relatório. Então como tratar isso? Agora iremos ver nossa função salvadora!

Chamando ISINSCOPE(), Chamando ISINSCOPE()… 📣

Retirado da documentação oficial

Conforme já bem explicado pelo excelente vídeo do Laennder Alves sobre esta função, ISINSCOPE() muda o contexto de cálculo conforme os parâmetros que estão nele.

Vamos utilizar um exemplo abaixo:

Veja que passando o parâmetro da Tabela1[Cliente] para a ISINSCOPE() temos o retorno True quando a linha pertence ao Cliente e False quando não pertence. Dessa forma podemos utilizar concomitantemente com SWITCH() para fazermos os cálculos necessários:

Explicando a medida:

Valor do repasse correto =
SWITCH(

TRUE();

ISINSCOPE(Tabela1[Cliente]);[Valor de repasse];

SUMX(VALUES(Tabela1[Cliente]);[Valor de repasse])

)

SWITCH passa por cada linha e analisa o contexto que ela se encontra. Caso encontre um contexto [Cliente], realiza o cálculo normal de [Valor de repasse] (no caso [Soma valor venda] * [Result Taxa efetiva]). Caso não seja esse contexto, é feito um SUMX onde o parâmetro VALUES indica por onde a soma pode ser realizada (caso não tenha entendido muito bem a utilização destas funções recomendo o vídeo do Leonardo Karpinski que explica isso com maestria)😉

Podemos melhorar nossa matriz mais ainda se tirarmos os valores percentuais dos contextos que não envolvem o Cliente.

Caso queira o arquivo de exemplo, estou disponibilizando o .pbix neste link

Bom, é isso pessoal. Em caso de dúvidas, podem utilizar o campo dos comentários.

Até logo! 😎

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *