Como calcular a percentagem do total em DAX: passo a passo
Mostrar cada valor como percentagem do total é uma das análises mais pedidas em qualquer relatório: quanto pesa cada categoria, região ou produto dentro do total geral. Em DAX, o segredo está em comparar o valor da linha atual com um total que ignora os filtros dessa mesma linha. Quando essa comparação está bem feita, a soma das percentagens dá sempre 100% — e é isso que vamos construir aqui, do zero e de forma reutilizável.
Pré-requisitos
- Power BI Desktop instalado, ou o Power BI Service com um modelo que possa editar.
- Uma tabela de factos com valores numéricos — vamos usar uma tabela
Vendascom a colunaValor. - Pelo menos uma coluna para agrupar os dados, como
Vendas[Categoria]. - Saber criar uma medida simples com
SUM. Não é preciso mais nada.
Passo 1: Criar a medida base do total
Antes de pensar em percentagens, precisamos de uma medida que some os valores. Esta medida reage ao contexto de filtro: numa matriz por categoria, devolve o total de cada categoria; numa linha de total, devolve o total de tudo.
Total Vendas = SUM ( Vendas[Valor] )
Crie a medida com o botão Nova medida e arraste-a para uma matriz que tenha Vendas[Categoria] nas linhas. Deve ver um valor diferente por categoria.
Passo 2: Calcular o total geral com ALL
A percentagem precisa de um denominador que não mude de linha para linha: o total geral. A função ALL remove os filtros de uma coluna ou tabela, e CALCULATE recalcula a medida nesse novo contexto sem filtros. O resultado é o total de todas as categorias, mesmo quando estamos dentro da linha de uma só.
Total Geral =
CALCULATE (
[Total Vendas],
ALL ( Vendas[Categoria] )
)
Se juntar esta medida à matriz, vai reparar que ela mostra o mesmo número em todas as linhas. Parece estranho à primeira vista, mas é precisamente o denominador que procuramos: o "todo" contra o qual cada categoria será comparada.
Passo 3: Dividir para obter a percentagem
Agora combinamos as duas ideias numa só medida. Usamos DIVIDE em vez da barra de divisão porque DIVIDE devolve um valor em branco (em vez de um erro) quando o denominador é zero. As variáveis VAR tornam a fórmula mais legível e mais rápida, porque cada valor é calculado uma única vez.
% do Total =
VAR TotalCategoria = [Total Vendas]
VAR TotalGeral =
CALCULATE ( [Total Vendas], ALL ( Vendas[Categoria] ) )
RETURN
DIVIDE ( TotalCategoria, TotalGeral )
Por fim, selecione a medida e formate-a como Percentagem, com uma ou duas casas decimais. Agora cada categoria mostra o seu peso real no total.
Dica: dê nomes claros às medidas. "% do Total" é imediatamente compreensível para quem abre o relatório meses depois.
Passo 4: Respeitar os filtros com ALLSELECTED
Há uma subtileza que faz toda a diferença. Como ALL remove todos os filtros, ele também ignora as segmentações (slicers) que o utilizador escolheu. Se filtrar por um ano e quiser que 100% represente apenas esse ano, precisa de ALLSELECTED, que respeita os filtros vindos dos visuais e segmentações.
% do Total (Selecionado) =
DIVIDE (
[Total Vendas],
CALCULATE ( [Total Vendas], ALLSELECTED ( Vendas[Categoria] ) )
)
Regra prática: use ALL quando 100% deve ser sempre o total absoluto; use ALLSELECTED quando 100% deve refletir aquilo que o utilizador filtrou no relatório.
Verificar o resultado
Coloque Vendas[Categoria] numa matriz com as medidas [Total Vendas] e [% do Total] e procure dois sinais de que está tudo certo:
- A coluna de percentagens soma 100% na linha de total.
- Ao adicionar uma segmentação por ano, a versão com
ALLSELECTEDcontinua a somar 100%, enquanto a versão comALLpassa a somar menos de 100%, porque compara com o total de todos os anos.
Este teste dos 100% é a forma mais rápida de confirmar o resultado e de decidir qual das funções usar em cada caso.
Conclusão
Com apenas três peças — uma medida base, um denominador com ALL ou ALLSELECTED, e DIVIDE para evitar erros — já consegue calcular qualquer percentagem do total em DAX e aplicar o mesmo padrão a regiões, produtos ou clientes. O passo seguinte é calcular a percentagem dentro de uma hierarquia, mostrando o peso de cada produto na sua categoria. Que argumento acha que teria de mudar na função ALL para conseguir esse efeito?