função SUMX » Fabio Vianna
A função SUMX é uma função faz uma soma, mas ao contrário da função SUM ela soma valores a partir da leitura de cada uma das linhas de uma determinada tabela.
Depois que explicar vai ficar mais simples de entender 🙂
No exemplo a seguir queremos calcular o custo total de cada um dos produtos. Nós temos uma tabela com o cadastro de produtos e a indicação de seu custo unitário e outra tabela com a informação de venda desses produtos e portanto a quantidade de cada um deles.
Esta é a tabela de produtos:
Esta a de vendas. Note que elas se relacionam pela coluna de Código do Produto.
Se criarmos uma medida simplesmente multiplicando a coluna de Custo Unitário e de Quantidade teremos isto:
Note que Quantidade é uma medida que está SOMANDO a coluna de Volume de vendas. Já no caso do custo unitário precisamos fazer alguma "agregação" dele através de uma função. No caso estamos usando a função SUM.
O que essa função SUMX fará?
Lembremos sempre da questão do contexto. Se por exemplo colocarmos essa medida em um cartão nós teremos isto:
O contexto do cartão será TUDO, então a medida vai somar toda a quantidade (55.300) e vai multiplicar pela soma do custo unitário (5,83):
Óbvio que está errado, porque na verdade a função deveria ter pego o custo unitário para cada produto, multiplicado pelo volume de vendas de cada um deles e somente depois disto somado os valores.
Se colocarmos esta medida em uma tabela é isto o que vamos ver:
O custo de cada produto está correto, porque a medida está trabalhando naquele contexto de produto, então ela vai somar somente a quantidade daquele produto e vai "somar" custo unitário dele.
Como só temos um custo para cada produto então ela vai fazer a conta corretamente.
Já no total da família temos um valor errado, pois a medida irá somar o volume de vendas de todos os produtos daquela família (está OK) . Em seguida vai multiplicar pela soma de todos os custos unitários dos produtos daquela família. Bom, já sabemos que não vai dar certo.
Temos esse problema porque a função SUM está fazendo o que se espera dela, que é trabalhar dentro do contexto de filtro, isto é, está somando os valores para aquele produto, cidade, estado, etc…
Para termos o cálculo correto precisamos da função SUMX, porque é ela quem "anda" por todas as linhas da tabela antes de fazer a soma (a isto chamamos de contexto de linha).
Precisamos dizer que é para a função ir de linha em linha na tabela de PRODUTOS fazendo o cálculo de cada um dos produtos, e somente após isto ela somá-los.
Sintaxe da função SUMX
A sintaxe dela será esta:
O 1º argumento é a tabela onde a função vai "andar" (em inglês chama-se iteration, mas resolvi abrasileirar para "andar"). Significa que ela irá ler linha por linha da tabela de produtos.
O 2º argumento indica que cálculo ela deve fazer ao andar linha por linha. Bom, queremos pegar o volume de vendas DAQUELE PRODUTO e multiplicar pelo seu CUSTO UNITÁRIO.
Veja que aqui não estamos somando a coluna de Custo Unitário, estamos apenas indicando a coluna, pois é assim que a função irá multiplicar cada linha.
Depois de fazer essa multiplicação ela vai somar o seu resultado.
Veja que agora o cálculo está correto, mesmo nos totais da famílias, porque a função está sempre lendo linha a linha da tabela de produtos e somando somente o resultado final na família.
No caso do exemplo com a SUM ela somava o custo unitário daquela família.
E se usássemos a tabela de Vendas?
Ela também funcionaria, pois ele somente iria somar os valores depois de fazer a multiplicação em cada uma das linhas, o único cuidado seria para trazer o valor do custo unitário, pois precisaríamos usar a função RELATED para trazer o valor individual de cada produto para a medida:
A função vai "andar" por todas as linhas da tabela de Vendas fazendo a multiplicação. Em seguida despejará seu resultado de acordo com o contexto de filtro que tivermos em nosso visual: