Na comunidade muitas vezes surgem questões, mas os utilizadores não especificam qual o tipo de resultado que pretendem. Esta indefinição faz com que dependendo da nossa abordagem ao problema possam surgir opções de cálculos em DAX ou Power Query? Medidas ou colunas?
Claro que a escolha da melhor opção é também ela muito ambígua e pode ser influenciada por diversos fatores, tipo de modelo, dimensão dos dados, entre outras.
No entanto penso que um dos fatores que mais influencia a opção final é o próprio utilizador questões como o grau de experiência, conhecimento da ferramenta, urgência na resolução da questão, podem muitas vezes sobrepor-se a questões de desempenho ou de melhores praticas.
Nesta publicação demonstro como uma simples pergunta me levou a dar duas opções de modo que o utilizador conseguisse optar pela que mais se adequasse às suas necessidades.
A informação era composta por duas tabelas:
Product | Product Rate |
ABC | 1000 |
DEF | 2000 |
XYZ | 3000 |
Order | Product | Total |
100001 | ABC | 10 |
100002 | DEF | 11 |
100003 | XYZ | 12 |
100004 | ABC | 13 |
100005 | DEF | 14 |
100006 | XYZ | 15 |
A ideia era calcular a divisão do Total pelo Product Rate e multiplicar esse valor por 10.
Sendo que o resultado esperado seria o seguinte:
Order | Product | Total | Rate (which is derived as ( total /Product rate) *10 | Calculation |
100001 | ABC | 10 | 0.1 | (10/1000) * 10 |
100002 | DEF | 11 | 0.055 | (11/2000) * 10 |
100003 | XYZ | 12 | 0.04 | (12/3000) * 10 |
100004 | ABC | 13 | 0.13 | (13/1000) * 10 |
100005 | DEF | 14 | 0.07 | (14/2000) * 10 |
100006 | XYZ | 15 | 0.05 | (15/3000) * 10 |
Assim podemos neste caso podemos ter duas opções uma abordagem no Power Query ou uma abordagem DAX.
Power Query
Em Power Query teremos que criar uma nova coluna com a seguinte formula:
([Total]/
(let Product = [Product] in Table.SelectRows(Rates, each [Product] = Product)){0}[Product Rate])
* 10
Na fórmula acima com a utilização do Table.SelectRows conseguimos obter uma tabela com as linhas que correspondem aos critérios de seleção, neste caso o Product, depois devolvemos o primeiro resultado da Product Rate dessa tabela assim conseguimos calcular o valor necessário.
DAX (coluna calculada)
Tendo em atenção que a tabela das rates apenas tem um único valor por Product se criarmos uma relação entre as duas tabelas podemos então adicionar a seguinte coluna:
Rate = DIVIDE(Orders[Total ], RELATED(Rates[Product Rate ])) * 10
A utilização do RELATED devolve um valor singular que está relacionado com a linha atual, neste caso como as tabelas estão relacionadas por Product podemos devolver o valor do Product Rate.
Assim podemos ter duas opções que nos dão o resultado esperado, no entanto que numa quer noutra os conhecimentos do utilizador podem ser preponderantes na escolha da opção.
As questões de desempenho e modelação são importantes, no entanto, a decisão final vai sempre depender da nossa opinião sobre essas soluções e temos tendência a não implementar as que nos parecem, seja por que motivo for, mais complexas.