Pular para o conteúdo
Fynx
Power BI11 min de leitura

ALL e ALLEXCEPT em DAX: o que faz e quando usar (com exemplos)

Guia prático sobre ALL e ALLEXCEPT DAX: o que cada função faz, como remover e preservar filtros, exemplos, armadilhas comuns e boas práticas.

F
Fynx

A maioria dos erros com percentual do total nasce aqui

Se você já tentou calcular o percentual que cada produto representa dentro de uma categoria e o resultado deu 100% em toda linha, ou deu um número que muda quando você não esperava, o problema quase nunca é a fórmula da divisão. É o contexto de filtro. E é exatamente aí que entra o par mais mal compreendido do DAX. Entender ALL e ALLEXCEPT DAX é entender como o Power BI decide quais linhas somar em cada célula do visual, e sem isso qualquer medida de participação, ranking ou média móvel vira loteria.

Neste artigo eu vou direto ao ponto: o que cada uma faz, como elas manipulam filtro, exemplos que você reconhece do dia a dia, as armadilhas que mais derrubam relatório em produção e as boas práticas que a gente aplica nos projetos de modelagem e Power BI da Fynx. Se você ainda está construindo base em DAX, vale ler antes o nosso guia de boas práticas de modelagem e DAX, porque aqui eu assumo que você já sabe o que é uma medida e o que é contexto de filtro.

O contexto de filtro é o que essas funções manipulam

Antes de falar de ALL, precisamos combinar um conceito. Toda medida em DAX é avaliada dentro de um contexto de filtro. Quando você coloca uma medida numa matriz cruzada com Categoria nas linhas e Ano nas colunas, cada célula é calculada com os filtros daquela interseção: Categoria = "Bebidas" e Ano = 2025, por exemplo. O DAX soma apenas as linhas que sobrevivem a esses filtros.

ALL e ALLEXCEPT não somam nada sozinhas. Elas são funções de tabela que devolvem linhas ignorando filtros, e você as usa como argumento do CALCULATE (ou de funções como CALCULATETABLE) para dizer: "para esta conta, quero que você desconsidere tal filtro". A diferença entre as duas está no que exatamente elas ignoram e no que preservam.

Pense assim: ALL é a tesoura que remove filtros. ALLEXCEPT é a tesoura que remove tudo, menos as colunas que você mandou proteger. Uma remove, a outra preserva. Todo o resto é detalhe de sintaxe.

ALL remove filtros da tabela ou das colunas que você indicar

A função ALL retorna todas as linhas de uma tabela, ou todos os valores distintos de uma ou mais colunas, ignorando qualquer filtro que estivesse aplicado. Ela tem três formas de uso na prática:

  • ALL(Tabela): ignora todos os filtros da tabela inteira.
  • ALL(Tabela[Coluna]): ignora o filtro apenas daquela coluna, mantendo os demais.
  • ALL(Tabela[ColA], Tabela[ColB]): ignora o filtro dessas colunas específicas.

O caso clássico é o percentual do total. Imagine que você quer, em cada linha de produto, o quanto ele representa do faturamento total, sem que a linha se limite a si mesma:

Pct do Total = DIVIDE( [Faturamento], CALCULATE( [Faturamento], ALL(Produtos) ) )

O numerador respeita o contexto da linha (o faturamento daquele produto). O denominador usa ALL(Produtos) para remover o filtro de produto e devolver o faturamento total da tabela. A divisão dá a participação. Se você trocar ALL(Produtos) por ALL(Produtos[Produto]), o comportamento é praticamente o mesmo nesse cenário, mas passa a importar quando há outros filtros vindos da mesma tabela que você quer manter.

Uma observação que evita dor de cabeça: ALL como argumento de CALCULATE funciona como um removedor de filtro (o chamado REMOVEFILTERS, que a Microsoft criou justamente para deixar a intenção explícita). Quando você usa ALL fora do CALCULATE, como argumento de um SUMX ou FILTER, ela age como função de tabela pura, apenas retornando linhas. É o mesmo comando com dois papéis, e confundir os dois é fonte de bug.

ALLEXCEPT preserva os filtros das colunas que você protege

ALLEXCEPT faz o oposto do que o nome sugere à primeira vista. Ela remove todos os filtros da tabela, exceto os das colunas que você lista. A sintaxe é:

ALLEXCEPT( Tabela, Coluna1, Coluna2, ... )

O uso mais comum é calcular um total por grupo mantendo o agrupamento, mas ignorando filtros mais finos. Suponha uma tabela de vendas com Categoria e Produto. Você quer, em cada linha de produto, o faturamento total da categoria à qual ele pertence:

Faturamento da Categoria = CALCULATE( [Faturamento], ALLEXCEPT( Produtos, Produtos[Categoria] ) )

Aqui ALLEXCEPT remove o filtro de Produto (e de qualquer outra coluna da tabela Produtos), mas preserva o filtro de Categoria. O resultado é que todas as linhas de produtos da mesma categoria mostram o mesmo número: o total da categoria. A partir daí, um DIVIDE([Faturamento], [Faturamento da Categoria]) dá a participação do produto dentro da sua categoria, que era o problema do começo do artigo.

A pergunta que fecha a decisão é simples: você quer listar o que preservar ou o que remover? Se são poucas colunas a preservar e muitas a remover, ALLEXCEPT é mais enxuto. Se é o contrário, ALL de colunas específicas costuma ser mais legível.

ALL e ALLEXCEPT resolvem o mesmo problema por caminhos opostos

Muita gente escreve as duas de forma equivalente sem perceber. As expressões abaixo produzem o mesmo total por categoria, e escolher uma ou outra é questão de clareza e manutenção:

ObjetivoCom ALLCom ALLEXCEPT
Total da categoria em cada linha de produtoCALCULATE([Faturamento], ALL(Produtos[Produto]))CALCULATE([Faturamento], ALLEXCEPT(Produtos, Produtos[Categoria]))
Total geral ignorando tudo da tabelaCALCULATE([Faturamento], ALL(Produtos))CALCULATE([Faturamento], ALLEXCEPT(Produtos, <nada a preservar>))
Ignorar só o filtro de dataCALCULATE([Faturamento], ALL(Calendario[Data]))menos natural, evite

Repare na diferença de mentalidade. Com ALL(Produtos[Produto]) você diz "esqueça qual produto está selecionado". Com ALLEXCEPT(Produtos, Produtos[Categoria]) você diz "esqueça tudo de Produtos, menos a categoria". Nos dois casos a categoria continua filtrando. A vantagem do ALLEXCEPT aparece quando a tabela tem muitas colunas e você não quer listar uma por uma no ALL. A vantagem do ALL aparece quando você quer cirurgia fina em uma única coluna.

Um resumo rápido de quando cada abordagem tende a ser a melhor escolha:

SituaçãoPrefiraPor quê
Percentual sobre o total geralALL(Tabela) ou ALL(Coluna)Remove tudo de forma explícita
Percentual dentro de um grupo (categoria, região, gestor)ALLEXCEPTPreserva o agrupamento sem listar o resto
Ranking que ignora o item da linhaALL da coluna do itemCirurgia em uma coluna só
Média por cliente mantendo o clienteALLEXCEPT preservando a chave do clienteMantém o grão do cliente
Limpar filtros de várias colunas de uma dimensão grandeALLEXCEPTMais curto que listar tudo no ALL

As armadilhas que mais quebram medidas em produção

Conheço poucas funções que geram tantos chamados de suporte quanto essas duas. Os erros se repetem, então vale nomear os principais.

A primeira armadilha é usar ALLEXCEPT com uma coluna que não está no contexto do visual. ALLEXCEPT preserva o filtro da coluna, mas se aquela coluna não está filtrando nada naquela célula, não há o que preservar, e o resultado vira o total geral. Isso costuma acontecer quando a matriz mostra Produto mas você escreveu ALLEXCEPT(Produtos, Produtos[Categoria]) e a categoria não aparece em lugar nenhum do visual nem em segmentação. A medida "funciona" no seu teste e falha no relatório do usuário.

A segunda é misturar tabelas. ALLEXCEPT(Produtos, Produtos[Categoria]) só mexe nos filtros da tabela Produtos. Se existe um filtro de data na tabela Calendario, ele continua valendo, porque ALLEXCEPT não tocou nele. Gente experiente esquece disso e passa horas atrás de um "total que muda com o mês" sem entender que a data nunca foi removida.

A terceira é confundir ALL com ALLSELECTED. ALL ignora tudo, inclusive segmentações que o usuário escolheu. ALLSELECTED respeita o que foi selecionado na página e ignora só o contexto interno do visual. Para "percentual do total do que está filtrado na tela", ALLSELECTED é o certo, não ALL. Trocar um pelo outro dá um denominador errado que ninguém percebe até alguém conferir na mão.

A quarta é relação de tabelas. ALL sobre a tabela fato pode não remover o filtro que chega via relacionamento a partir de uma dimensão. O filtro propagado pela relação precisa ser tratado na coluna certa. Quando o modelo é limpo e em estrela, isso quase não aparece. Quando o modelo tem relacionamentos bidirecionais ou floco de neve mal resolvido, vira caça ao fantasma. É mais um motivo para investir em modelagem e engenharia de dados antes de encher o relatório de medidas defensivas.

Boas práticas que a gente aplica nos projetos

Depois de muitos modelos revisados, algumas regras se provaram. Elas não são dogma, são economia de tempo.

Prefira REMOVEFILTERS quando a intenção é só limpar filtro. É a mesma coisa que ALL dentro do CALCULATE, porém o nome deixa claro para quem lê a medida seis meses depois. Reserve ALL para quando você realmente usa a tabela retornada em iteração.

Nomeie a medida pelo que ela faz com o contexto. "Faturamento da Categoria", "Pct dentro da Região", "Total Ignorando Data". Medida com nome vago é armadilha esperando acontecer, porque quem reusa não sabe qual filtro foi removido.

Teste a medida em três lugares: no total, numa linha de detalhe e com uma segmentação ativa. A maioria dos bugs de ALL e ALLEXCEPT só aparece quando você muda o contexto. Se a medida se comporta certo nesses três cenários, ela costuma estar sólida.

Documente o grão preservado. Quando usar ALLEXCEPT, deixe um comentário dizendo qual coluna sobrevive. Isso evita que o próximo desenvolvedor troque a dimensão do visual e quebre a conta sem saber por quê. Governança de medida é parte de governança de dados, não um capricho.

Não empilhe removedores por medo. Vejo medidas com ALL, ALLEXCEPT e ALLSELECTED na mesma expressão, cada um cancelando o outro. Quando isso acontece, o problema quase sempre é o modelo, não a fórmula. Resolver na modelagem é mais barato do que remendar em DAX.

Perguntas frequentes

Qual a diferença essencial entre ALL e ALLEXCEPT? ALL remove filtros: da tabela inteira ou das colunas que você indicar. ALLEXCEPT remove todos os filtros da tabela, exceto os das colunas que você lista para preservar. Uma parte do princípio de apagar, a outra do princípio de proteger. Escolha pela que deixa a intenção mais legível no seu caso.

ALLEXCEPT preserva ou remove os filtros das colunas listadas? Preserva. As colunas que você passa depois do nome da tabela são as que continuam filtrando. Todo o resto da tabela tem o filtro removido. O nome engana muita gente, porque "except" soa como exclusão, mas o que fica de fora da remoção é justamente o que você lista.

Quando devo usar ALLSELECTED em vez de ALL? Use ALLSELECTED quando quer o total do que está filtrado na tela, respeitando as segmentações do usuário. Use ALL quando quer o total absoluto, ignorando inclusive as escolhas do usuário. Para um percentual que soma 100% dentro do que foi filtrado na página, ALLSELECTED é o correto.

Por que meu percentual do total dá 100% em todas as linhas? Porque o denominador está sendo calculado no mesmo contexto da linha, sem remover o filtro. Você precisa envolver o total em CALCULATE com ALL ou ALLEXCEPT para que o denominador ignore o filtro do item e devolva o total do grupo ou o total geral. Sem isso, numerador e denominador são iguais.

ALL funciona através de relacionamentos entre tabelas? ALL age sobre a tabela ou coluna que você passa. Filtros que chegam por relacionamento a partir de uma dimensão precisam ser removidos na coluna certa, geralmente na própria dimensão. Em modelos estrela bem construídos isso é direto. Em modelos com relacionamento bidirecional, o comportamento exige mais atenção e teste.

Vale mais a pena aprender ALL ou REMOVEFILTERS? São a mesma operação dentro do CALCULATE. REMOVEFILTERS existe para deixar a intenção clara quando você só quer limpar filtro. Aprenda ALL primeiro, porque ela também é função de tabela e aparece em iterações, e use REMOVEFILTERS quando o objetivo for apenas remover filtro dentro de um CALCULATE.

Fechando

ALL e ALLEXCEPT não são funções difíceis. O que é difícil é pensar em contexto de filtro, e elas apenas te dão o controle sobre isso. Quando você para de decorar fórmula e passa a raciocinar sobre o que precisa ser removido e o que precisa ser preservado, medida de participação, ranking e média por grupo deixam de ser tentativa e erro. O resto é teste em três contextos e nomes honestos.

Se o seu modelo já está grande e as medidas viraram uma teia de removedores que ninguém entende, isso costuma ser sintoma de modelagem, não de DAX. É o tipo de coisa que a gente destrava rápido. Fale com a gente e mostramos como deixar o seu Power BI previsível de novo.

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

Vamos transformar seus dados em decisão?

Conte seu cenário. Devolvemos um diagnóstico e uma proposta com faixa de investimento em poucos dias úteis, sem folheto, direto ao ponto.