Power BI RANKX usando SUM de uma coluna calculada

Recentemente eu tive um amigo pedindo ajuda pra resolver um problema de RANKX. Ele queria mostrar o rank dos chamados dele de acordo com uma soma de pontos definida por ele.

Então assim, ele tinha lá que o chamado 123 tinha 8 pontos e o chamado 456 tinha 6 pontos, então o chamado 123 deveria ser rank 1 e o outro rank 2. No modelo dele havia uma coluna que calculava o total de pontos e o RANKX é feito em cima dessa coluna.

Para tabelas em que esse conceito era aplicado e que possuíam apenas 1 registro por chamado, o RANKX funcionava, porém, em tabelas com várias linhas para o mesmo chamado, o RANKX não funcionava.

A resolução veio quando entendemos melhor o contexto em que o RANKX estava sendo aplicado. É importante saber que RANKX funciona com ROW CONTEXT, e por isso que, quando temos apenas 1 chamado por registros, temos 1 linha por registo, uma ROW por registro, então o RANKX funciona de boa, mas quando você tem várias linhas para o mesmo registros, contendo a mesma informação, dá ruim. Vou explicar melhor.

Conheça sua base de dados:

Perceba que o número do chamado se repete várias vezes (eu sei, a imagem está filtrada, é só um exemplo).

Se fizermos uma pivot table nessa tabela, temos um resultado assim:

Então já temos nosso RANKX pronto, é só considerar a SOMA de CALC_TOTAL e aplicar o RANKX em cima dela. O problema é que isso não funciona…

Se eu fizer uma coluna calculada de SUM(CALC_TOTAL) o resultado é esse:

Não é o mesmo valor… Isso porque é uma coluna calculada, se fosse uma measure, iria dar certo.

Se você tentar criar um RANKX sobre a SUM da coluna calculada CALC_TOTAL, o resultado vai ser esse:

calc_total rank cc = RANKX(Problems, SUM(Problems[Calc_Total]))

O problema é o CONTEXTO… O SUM no RANKX vai acontecer a nível de linha, então o que acontece é que, o chamado 4002171, que deveria ser o rank 1, está atualmente como rank 122, porque? Porque a nível de linha ele é o rank 122, ou seja, a nível de linha o 4002171 tem valor 9, enquanto que, a nível de linha, o chamado rank 1 tem valor 13.

O problema é que, nós não queremos aplicar RANKX a nível de linha. O que queremos é aplicar o RANKX de acordo com a SOMA das linhas, ou seja, eu preciso calcular esse valor total de cada chamado e só então aplicar o rank.

Existem várias formas de resolver isso, vou mostrar como eu fiz. Não sei se é a mais performática, mas resolveu rápido o problema do meu amigo.

Ficou assim:

Primeiro criei uma coluna nova pra calcular o valor total do ticket:

CALC_TOTAL POR TICKET = CALCULATE( SUM(Problems[Calc_Total]), FILTER( Problems, Problems[Número Chamado] = EARLIER(Problems[Número Chamado]) ))

Depois, criei uma measure de RANKX usando o MAX do valor dessa coluna calculada:

CALC_TOTAL RANK m = RANKX( ALL(Problems), CALCULATE( MAX(Problems[CALC_TOTAL POR TICKET]) ),,,Dense)

O resultado:

Referências:

https://radacad.com/how-to-use-rankx-in-dax-part-1-of-3-calculated-columns

Published by Pedro Carvalho

Apaixonado por análise de dados e Power BI

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: