Percentual do total em DAX: o que faz e quando usar (com exemplos)
Aprenda a calcular o percentual do total DAX com DIVIDE, ALL, ALLSELECTED e ALLEXCEPT, entenda a diferença entre eles e acerte o denominador em cada nível.
O número que parece simples e derruba mais relatório do que qualquer outro
Calcular o percentual do total DAX parece a coisa mais trivial do mundo: pega o valor da linha, divide pelo total, formata como porcentagem e pronto. Só que na prática é aqui que a maioria dos relatórios começa a mentir. A medida de participação dá 100% em toda linha, ou muda de valor quando o usuário clica num slicer, ou soma acima de 100% dentro de uma categoria. O problema quase nunca é a divisão. É o denominador, ou melhor, é o contexto de filtro que define qual denominador o DAX usa em cada célula.
Neste artigo eu vou direto ao ponto: o padrão DIVIDE(valor, total), como obter o total certo removendo o contexto de filtro com ALL, ALLSELECTED e ALLEXCEPT, a diferença prática entre os três, como calcular percentual dentro de uma hierarquia e os cuidados com o denominador que separam uma medida confiável de uma que engana a diretoria. Assumo que você já sabe o que é uma medida e o que é contexto de filtro. Se ainda está montando base, vale ler antes o nosso guia de boas práticas de modelagem e DAX.
O denominador é o problema, não a divisão
Toda medida em DAX é avaliada dentro de um contexto de filtro. Quando você coloca uma medida numa matriz com Categoria nas linhas, cada linha calcula com o filtro daquela categoria. Se você escreve [Faturamento] / [Faturamento], o numerador e o denominador enxergam exatamente o mesmo filtro, os dois valores são iguais e o resultado é 100% em toda linha. É o erro número um de quem está começando.
O truque do percentual do total é fazer o numerador respeitar o contexto da linha e o denominador ignorar parte dele. O numerador continua sendo o faturamento daquele produto, daquela categoria, daquele mês. O denominador precisa ser um valor maior, mais abrangente, calculado como se aquele filtro não existisse. As funções que fazem isso são ALL, ALLSELECTED e ALLEXCEPT, sempre usadas dentro de CALCULATE para modificar o filtro do denominador.
Antes de qualquer uma delas, uma regra de higiene: nunca use o operador / puro para dividir. Use sempre DIVIDE. A função DIVIDE trata a divisão por zero de forma controlada e devolve um valor alternativo (por padrão em branco) quando o denominador é zero ou vazio, em vez de estourar um erro de infinito no visual. Isso não é preciosismo, é o que evita que um mês sem faturamento quebre o relatório inteiro.
% do Total Geral =
DIVIDE (
[Faturamento],
CALCULATE ( [Faturamento], ALL ( 'Vendas' ) )
)
Aqui o denominador CALCULATE([Faturamento], ALL('Vendas')) calcula o faturamento removendo todos os filtros da tabela Vendas, ou seja, o total absoluto da base. A linha de Bebidas divide o faturamento de Bebidas pelo total de tudo. É o percentual sobre o total geral, e ele não muda mesmo que o usuário filtre outras coisas na tabela Vendas.
ALL, ALLSELECTED e ALLEXCEPT resolvem denominadores diferentes
As três funções servem para o mesmo propósito estrutural, montar o denominador ignorando filtros, mas o que cada uma ignora muda completamente o resultado. Essa é a decisão mais importante de qualquer medida de participação, e é onde eu vejo mais gente errar sem perceber.
| Função | O que faz no denominador | Quando o denominador é o certo |
|---|---|---|
ALL | Remove todos os filtros da tabela ou das colunas indicadas | Percentual sobre o total absoluto, ignorando slicers e seleção |
ALLSELECTED | Remove o filtro interno do visual, mas respeita a seleção externa do usuário | Percentual sobre o total do que está visível/selecionado |
ALLEXCEPT | Remove todos os filtros da tabela, exceto os das colunas que você protege | Percentual dentro de um grupo (categoria, região, cliente) |
O ALL é o mais agressivo. Ele desconsidera tudo, inclusive os slicers de página e a seleção do usuário. É a escolha certa quando você quer um percentual estável sobre o universo inteiro, mas é a escolha errada quando o usuário espera que o total acompanhe o filtro que ele aplicou.
O ALLSELECTED é o que respeita a intenção de quem está olhando o relatório. Ele remove o contexto de filtro que vem da própria estrutura do visual (as linhas da matriz, por exemplo), mas mantém os filtros externos, como slicers, segmentações e filtros de página. Na prática, se o usuário selecionou apenas 2025 e três categorias num slicer, o denominador com ALLSELECTED é o total daquelas três categorias em 2025, e o percentual de cada linha soma exatamente 100% dentro da seleção. É quase sempre o que a área de negócio realmente quer ver.
O ALLEXCEPT é a ferramenta da hierarquia. Ele remove os filtros da tabela, mas preserva os das colunas que você lista explicitamente. Serve para calcular o percentual dentro de um agrupamento sem precisar saber qual valor específico está selecionado.
Percentual dentro da categoria pede ALLEXCEPT
O caso mais comum em relatório de verdade não é o percentual sobre o total geral, é o percentual dentro de um grupo: quanto cada produto representa dentro da sua própria categoria, quanto cada vendedor representa dentro da sua região. Aqui ALLEXCEPT brilha, porque você diz ao DAX "esqueça todos os filtros de Produtos, menos o de Categoria".
% dentro da Categoria =
DIVIDE (
[Faturamento],
CALCULATE ( [Faturamento], ALLEXCEPT ( 'Produtos', 'Produtos'[Categoria] ) )
)
Numa matriz com Categoria e Produto, cada linha de produto divide o faturamento do produto pelo faturamento total da categoria a que ele pertence. Os produtos de Bebidas somam 100% dentro de Bebidas, os de Laticínios somam 100% dentro de Laticínios. O ALLEXCEPT faz isso sem que você escreva o nome de nenhuma categoria, porque ele apenas protege a coluna e deixa o contexto da linha definir qual categoria vale.
Dá para chegar no mesmo resultado com ALL('Produtos'[Produto]), removendo só o filtro de produto, mas ALLEXCEPT é mais robusto quando a tabela tem várias colunas descritivas (marca, subcategoria, fornecedor). Com ALL você teria que remover coluna por coluna. Com ALLEXCEPT você protege o que interessa e o resto sai junto. Menos código, menos manutenção.
Percentual em hierarquia depende do nível que você quer
Quando o visual tem uma hierarquia (Categoria, depois Subcategoria, depois Produto), o denominador correto depende de qual nível você toma como referência. Não existe uma fórmula única que resolva todos os níveis ao mesmo tempo de forma automática, você precisa decidir o que o percentual significa. A tabela abaixo mostra as combinações mais pedidas.
| Percentual desejado | Denominador (dentro de CALCULATE) | Comportamento |
|---|---|---|
| Do total geral | ALL('Vendas') | Fixo, ignora tudo, soma acima do nível |
| Do total selecionado | ALLSELECTED('Vendas') | Acompanha slicers, soma 100% no visível |
| Dentro da categoria | ALLEXCEPT('Produtos', 'Produtos'[Categoria]) | Cada produto sobre o total da sua categoria |
| Dentro da subcategoria | ALLEXCEPT('Produtos', 'Produtos'[Subcategoria]) | Cada produto sobre o total da sua subcategoria |
O ponto que confunde: se você quer que uma mesma medida se comporte diferente conforme o nível expandido da matriz, aí a coisa fica mais elaborada e envolve funções como ISINSCOPE para detectar em que nível a célula está sendo calculada. Isso é análise mais avançada de contexto e foge do escopo do percentual básico, mas é bom saber que existe quando o requisito aparecer. Na dúvida, prefira criar medidas separadas e explícitas para cada nível: é mais verboso, porém muito mais fácil de manter e de auditar seis meses depois.
Uma medida com ALLSELECTED bem construída já cobre a maioria dos casos de hierarquia, porque em cada nível ela devolve o percentual sobre o total daquele agrupamento visível. Veja o padrão que mais uso em produção:
% do Total Visível =
DIVIDE (
[Faturamento],
CALCULATE ( [Faturamento], ALLSELECTED () )
)
O ALLSELECTED() sem argumento remove o contexto de filtro vindo do próprio visual, mas respeita toda a seleção externa. Numa matriz hierárquica, o subtotal de cada categoria fica coerente com a soma das suas linhas, e o total do visual bate com o que o usuário selecionou. É a medida que menos gera pergunta de "por que esse número não fecha".
Os cuidados com o denominador que evitam relatório errado
Depois de muitos projetos, a lista de armadilhas do percentual do total é curta e sempre a mesma. Vale colar na parede.
- Numerador e denominador com o mesmo filtro. Se os dois usam o mesmo contexto, o resultado é 100% em toda linha. O denominador precisa remover algo que o numerador mantém.
ALLonde deveria serALLSELECTED. ComALL, o total fica fixo e não reage aos slicers. O usuário filtra três meses e o percentual continua dividindo pelo ano inteiro. Parece bug, e para a área de negócio é.- Divisão sem
DIVIDE. O operador/estoura erro em divisão por zero e polui o visual.DIVIDEdevolve branco (ou o valor alternativo que você definir) e mantém o relatório limpo. - Percentuais que não somam 100%. Quase sempre é sinal de que o denominador está num nível diferente do numerador, ou de que há linhas com valores nulos entrando na conta de um lado só.
- Denominador afetado por relacionamento inativo ou filtro cruzado. Em modelos com muitas tabelas,
ALL('Vendas')pode não limpar filtros que chegam por outra tabela relacionada. Nesses casos, avalie remover o filtro na dimensão certa em vez da tabela fato. - Formatação enganando. Formatar como porcentagem não valida a conta. Sempre teste com um caso conhecido: pegue um produto, confira o numerador, confira o denominador na mão e veja se o percentual bate.
Esses cuidados não são teoria. São o tipo de detalhe que a gente audita nos projetos de sustentação de BI quando um cliente chega dizendo que "o número do dashboard não fecha com o do ERP". Nove em cada dez vezes o modelo está certo e a medida de percentual está com o denominador no nível errado.
Qual função escolher, na prática
Para não deixar no abstrato, este é o roteiro de decisão que eu daria a qualquer analista da equipe:
- Quer o percentual sobre a base inteira, fixo, sem reagir a nada? Use
ALLna tabela fato. - Quer o percentual sobre o que o usuário selecionou, somando 100% no que está visível? Use
ALLSELECTED. É o padrão para a maioria dos dashboards executivos. - Quer o percentual dentro de um grupo (categoria, região, cliente)? Use
ALLEXCEPTprotegendo a coluna do grupo. - Sempre envolva a divisão em
DIVIDE.
Se o seu modelo ainda vai receber muitas medidas de participação, ranking e variação, o ganho de padronizar esses quatro passos é enorme. É o tipo de fundação que a gente monta nos trabalhos de Power BI e de analytics avançado da Fynx, porque medida de percentual mal feita se espalha e contamina KPI, meta e até cálculo de comissão.
Perguntas frequentes
Por que meu percentual do total dá 100% em todas as linhas?
Porque o numerador e o denominador estão usando exatamente o mesmo contexto de filtro. O denominador precisa remover o filtro que define a linha. Envolva o total num CALCULATE com ALL, ALLSELECTED ou ALLEXCEPT para que ele calcule um valor mais abrangente que o numerador.
Qual a diferença entre ALL e ALLSELECTED no denominador?
ALL remove todos os filtros, inclusive os slicers e a seleção do usuário, então o total fica fixo sobre a base inteira. ALLSELECTED remove apenas o filtro interno do visual (as linhas da matriz), mas respeita a seleção externa. Com ALLSELECTED, o percentual acompanha os slicers e soma 100% dentro do que está selecionado, que é o comportamento que a área de negócio costuma esperar.
Quando devo usar ALLEXCEPT em vez de ALL?
Use ALLEXCEPT quando quiser o percentual dentro de um grupo, preservando a coluna que define esse grupo. Por exemplo, cada produto sobre o total da sua categoria. Ele remove todos os filtros da tabela menos os das colunas que você protege, o que é mais limpo do que listar coluna por coluna com ALL em tabelas com muitos atributos descritivos.
Preciso mesmo usar DIVIDE em vez de barra?
Sim. DIVIDE trata a divisão por zero de forma controlada e devolve um valor alternativo (em branco por padrão) quando o denominador é zero ou vazio, em vez de gerar erro de infinito. O operador / estoura erro nesses casos e polui o visual. É uma boa prática sem custo de performance relevante.
Como calcular o percentual dentro de uma hierarquia com vários níveis?
O denominador depende do nível que você toma como referência. Para o total do que está visível em cada nível, ALLSELECTED() resolve a maior parte dos casos. Para comportamento diferente por nível expandido, você precisa detectar o nível com funções como ISINSCOPE. Na dúvida, crie medidas explícitas e separadas por nível: é mais fácil de manter e de auditar.
Meu percentual não soma 100%, o que houve? Normalmente o numerador e o denominador estão em níveis diferentes, ou há valores nulos entrando na conta de apenas um dos lados. Confira se o denominador está removendo exatamente o filtro certo e teste com um caso conhecido: calcule numerador e denominador na mão para um item e veja onde a conta diverge.
Fechamento
Percentual do total em DAX é um daqueles cálculos que parecem triviais e escondem toda a complexidade do contexto de filtro. Acerte três decisões, o denominador certo com ALL, ALLSELECTED ou ALLEXCEPT, o nível correto na hierarquia e o DIVIDE protegendo a divisão, e a sua medida de participação passa a merecer confiança. Erre uma delas e o relatório inteiro perde credibilidade na primeira reunião de diretoria.
Se você quer que suas medidas de percentual, ranking e variação fiquem à prova de auditoria desde o modelo, fale com a gente. A Fynx estrutura DAX que fecha com o ERP e sobrevive ao dia a dia.
Quer aplicar isso na sua empresa?
A Fynx implementa BI, Power BI e Power Platform de ponta a ponta. Conte seu cenário e devolvemos um diagnóstico direto ao ponto.
Falar com um especialista