CALCULATE em DAX: o que faz e quando usar (com exemplos)
Entenda CALCULATE DAX na prática: o que a função faz, sintaxe, exemplos conceituais, armadilhas de contexto de filtro e boas práticas de quem vive Power BI.
CALCULATE é a função que separa quem só arrasta campo de quem realmente modela dados
Se você já escreveu um SUM ou um AVERAGE no Power BI e achou que sabia DAX, tudo bem: você aprendeu o alfabeto. CALCULATE DAX é onde a linguagem começa de verdade. É a única função que consegue mudar o contexto de filtro no meio de um cálculo, e por causa disso ela está por trás de quase toda medida útil que existe: comparação com ano anterior, percentual do total, valor de um único produto, meta versus realizado. Praticamente tudo que soa como "análise" e não como "soma burra" passa por aqui.
O problema é que CALCULATE também é a função que mais confunde. Ela faz coisas que parecem mágica, e mágica que você não entende vira bug em produção. Neste artigo vou explicar o que a função realmente faz, mostrar a sintaxe com exemplos conceituais, apontar as armadilhas que mais derrubam gente boa e fechar com as boas práticas que a gente aplica em projeto real. Se você quer o panorama maior de DAX antes de mergulhar aqui, vale ler também nosso guia de modelagem e boas práticas de DAX.
O que CALCULATE faz: ela reescreve o contexto de filtro antes de calcular
Toda medida em Power BI é avaliada dentro de um contexto de filtro. Quando você coloca uma medida [Vendas] numa matriz cortada por ano e por região, o Power BI calcula aquele número respeitando o ano e a região daquela célula. Esse recorte é o contexto de filtro, e ele vem dos visuais, das segmentações e dos relacionamentos do modelo.
CALCULATE é a função que permite você intervir nesse recorte. A ideia central é simples de dizer e difícil de dominar: CALCULATE avalia uma expressão depois de aplicar (ou remover, ou substituir) os filtros que você passar. Ela não soma nada sozinha. Ela prepara o terreno e manda outra função somar.
A sintaxe é esta:
CALCULATE( <expressão>, <filtro1>, <filtro2>, ... )
O primeiro argumento é o que você quer calcular, normalmente uma agregação como SUM(Vendas[Valor]) ou uma medida já existente. Os argumentos seguintes são os filtros que modificam o contexto. Um exemplo conceitual clássico:
Vendas SP = CALCULATE( [Total Vendas], Regiao[UF] = "SP" )
Essa medida retorna o total de vendas de São Paulo, não importa o que o visual esteja mostrando. Mesmo que a linha da matriz seja "Rio de Janeiro", esse número traz São Paulo, porque CALCULATE sobrescreveu o filtro de UF que vinha do contexto.
Guarde esta frase: CALCULATE não filtra dados, ela reescreve o contexto e depois deixa a expressão calcular dentro do contexto novo. Quem entende isso para de errar 80% das medidas.
Como CALCULATE combina filtros: substitui dimensão, mas cruza condição
Aqui mora a primeira confusão séria. Quando você passa um filtro para CALCULATE, ele não simplesmente "se soma" ao que já existe. O comportamento depende da coluna.
Se o contexto já filtra por Regiao[UF] e você passa outro filtro na mesma coluna Regiao[UF], o seu filtro substitui o do contexto. Por isso a medida Vendas SP ignora a região da matriz. CALCULATE sobrescreve filtros da mesma coluna.
Já se você passa um filtro numa coluna diferente da que o contexto usa, os dois se combinam por interseção. A tabela abaixo resume o comportamento, que é a fonte de metade dos "por que esse número está errado" que a gente ouve.
| Situação | O que o contexto traz | O que você passa no CALCULATE | Resultado |
|---|---|---|---|
| Mesma coluna | UF = "RJ" (da matriz) | UF = "SP" | Vence o seu: só SP |
| Coluna diferente | UF = "RJ" (da matriz) | Ano = 2025 | Interseção: RJ e 2025 |
| Remoção explícita | UF = "RJ" (da matriz) | ALL(Regiao) | Ignora UF: todas as regiões |
| Sem filtro no contexto | nada | UF = "SP" | Só SP |
Essa lógica de substituir na mesma coluna e cruzar em colunas diferentes é o coração de CALCULATE. É também o motivo de a função ser tão poderosa para cálculos de participação, comparação e recorte.
Os dois tipos de filtro que você pode passar
CALCULATE aceita filtros de duas formas, e saber a diferença muda a qualidade do seu código.
O primeiro tipo é o filtro simples, aquela sintaxe curta Tabela[Coluna] = valor. Por baixo dos panos o motor transforma isso em algo mais completo, mas para você ela é legível e rápida de escrever. Serve para a maioria dos casos do dia a dia.
O segundo tipo é o filtro como tabela, em que você passa uma expressão que retorna uma tabela, normalmente com FILTER. Exemplo:
Vendas Alto Ticket =
CALCULATE(
[Total Vendas],
FILTER( Vendas, Vendas[Valor] > 1000 )
)
Você usa a forma com tabela quando a condição não cabe numa comparação simples, por exemplo quando ela envolve uma medida, uma agregação ou lógica entre colunas. O ponto de atenção é performance: FILTER avalia linha a linha e, sobre tabelas fato grandes, custa caro. Sempre que a condição couber num filtro simples, prefira o filtro simples. Deixe o FILTER para quando ele for realmente necessário.
Quando usar CALCULATE: os cenários que aparecem em todo projeto
Na prática, CALCULATE resolve um conjunto de problemas recorrentes. Vale reconhecê-los para saber que a resposta passa por ela.
Comparar com outro período. Toda análise de tempo, ano anterior, mês anterior, acumulado no ano, é CALCULATE modificando o filtro de datas, normalmente com apoio de funções de time intelligence como SAMEPERIODLASTYEAR ou DATESYTD. Sem CALCULATE, você não consegue "voltar no tempo" dentro de uma medida.
Calcular percentual do total. Para saber quanto um produto representa do total, você precisa de dois números no mesmo cálculo: o valor do produto (que vem do contexto) e o valor total (que ignora o produto). Esse "ignorar o produto" é CALCULATE([Total], ALL(Produto)).
Isolar um segmento fixo. Cartões de indicador do tipo "faturamento da matriz" ou "vendas do canal digital" são CALCULATE com um filtro fixo, independente do que o usuário selecionar.
Aplicar regras de negócio. Meta apenas de clientes ativos, receita apenas de contratos vigentes, ticket médio apenas de pedidos faturados. Tudo isso é recorte via CALCULATE.
A tabela a seguir liga o problema ao padrão de solução, que costuma ser o pulo do gato para quem está saindo do básico.
| Você quer... | Padrão com CALCULATE |
|---|---|
| Total ignorando um filtro do visual | CALCULATE( [Medida], ALL(Tabela) ) |
| Total de um segmento fixo | CALCULATE( [Medida], Tabela[Col] = "valor" ) |
| Comparar com o ano anterior | CALCULATE( [Medida], SAMEPERIODLASTYEAR(Datas[Data]) ) |
| Percentual do total | DIVIDE( [Medida], CALCULATE( [Medida], ALL(Dim) ) ) |
| Filtrar por condição complexa | CALCULATE( [Medida], FILTER( Fato, <condição> ) ) |
| Ativar relacionamento inativo | CALCULATE( [Medida], USERELATIONSHIP(a, b) ) |
As armadilhas que mais derrubam gente
CALCULATE tem comportamentos que não são intuitivos. Estes são os que mais causam retrabalho.
A transição de contexto. Este é o mais sutil e o mais importante. Quando você usa CALCULATE dentro de um iterador (como SUMX) ou dentro de uma coluna calculada, ele faz uma coisa chamada transição de contexto: transforma o contexto de linha atual em contexto de filtro. Na prática, isso significa que escrever CALCULATE([Total Vendas]) numa coluna calculada da tabela de clientes traz o total daquele cliente, não o total geral. Parece mágica, mas é regra. Quando você chama uma medida dentro de um iterador, o Power BI embrulha ela num CALCULATE invisível, e a transição de contexto acontece sem você ver. Muita medida "que dá o número errado" é transição de contexto agindo em silêncio.
Achar que o filtro sempre se soma. Como vimos, filtro na mesma coluna substitui, não soma. Quem espera soma vê São Paulo aparecer onde deveria estar Rio e passa horas caçando o motivo.
Usar ALL onde precisava de ALLEXCEPT ou REMOVEFILTERS. ALL remove todos os filtros da tabela ou coluna. Às vezes você quer remover quase todos, mas manter um. Aí a ferramenta é ALLEXCEPT, e trocar uma pela outra muda o resultado por completo.
Abusar de FILTER sobre a fato. FILTER(Vendas, ...) numa tabela de milhões de linhas é convite para lentidão. Quando a condição é sobre uma dimensão, filtre a dimensão, não a fato.
Esquecer que CALCULATE não recalcula a expressão base. Se sua medida base já tem um comportamento estranho, CALCULATE só vai propagar isso dentro do novo contexto. Ele não conserta lógica ruim, ele a repete em outro recorte.
Boas práticas de quem mantém isso em produção
Depois de muitos projetos, algumas regras se pagam sozinhas.
Escreva medidas, não colunas calculadas, para lógica de negócio. Medida é calculada sob demanda no contexto do visual e não infla o modelo. Se você está tentado a materializar CALCULATE numa coluna, quase sempre existe uma medida melhor. A distinção entre os dois é tema o suficiente para um capítulo à parte, e a gente detalha isso no guia de boas práticas de DAX.
Prefira filtros simples a FILTER sempre que possível. Além de mais legíveis, eles costumam gerar planos de consulta mais eficientes.
Use VAR para separar o cálculo base da lógica de recorte. Variáveis deixam a medida legível e evitam recalcular a mesma coisa várias vezes. Uma medida de percentual do total fica muito mais clara quando o total geral está numa variável nomeada.
Tenha um modelo bem construído antes de tudo. CALCULATE brilha em cima de um star schema com tabela de datas dedicada e relacionamentos corretos. Metade dos "problemas de DAX" que a gente encontra em projetos de Power BI são, na verdade, problemas de modelagem que empurraram complexidade para dentro das medidas. Se o modelo está errado, nenhum CALCULATE salva.
Documente o intento da medida. Vendas SP é óbvio hoje e um mistério daqui a seis meses. Um comentário curto explicando qual filtro foi sobrescrito economiza horas de quem herda o relatório, inclusive você mesmo.
Um exemplo conceitual ponta a ponta
Para amarrar tudo, imagine que você quer o percentual que cada categoria representa do total de vendas, sempre respeitando o filtro de ano que o usuário escolher, mas ignorando o filtro de categoria (senão o percentual seria sempre 100%).
% da Categoria =
VAR VendasCategoria = [Total Vendas]
VAR VendasTotal =
CALCULATE( [Total Vendas], ALL( Produto[Categoria] ) )
RETURN
DIVIDE( VendasCategoria, VendasTotal )
Repare no raciocínio. VendasCategoria usa o contexto como está, então respeita ano e categoria da linha. VendasTotal usa CALCULATE com ALL(Produto[Categoria]) para remover apenas o filtro de categoria, mantendo o de ano intacto, porque é outra coluna. DIVIDE protege contra divisão por zero. Cada peça faz uma coisa e o conjunto é legível. Isso é DAX bem escrito: não é o código mais curto, é o mais claro.
Perguntas frequentes
CALCULATE e CALCULATETABLE são a mesma coisa? Quase. A lógica de manipular o contexto de filtro é idêntica. A diferença é o que cada uma retorna: CALCULATE devolve um valor escalar (um número, um texto) e CALCULATETABLE devolve uma tabela. Você usa CALCULATETABLE quando precisa de uma tabela filtrada como base para outra operação, e CALCULATE quando o resultado final é um valor único para o visual.
Preciso de CALCULATE para tudo?
Não. Uma medida [Total Vendas] = SUM(Vendas[Valor]) não precisa de CALCULATE, porque ela só respeita o contexto sem modificá-lo. Você chama CALCULATE quando quer alterar o recorte: remover um filtro, fixar um segmento, comparar períodos. Se você não vai mudar o contexto, não embrulhe em CALCULATE sem motivo.
Por que minha medida com CALCULATE dá 100% em toda linha?
Provavelmente você removeu com ALL justamente a coluna que a linha usa como base de comparação, ou não removeu nada e dividiu o valor por ele mesmo. No cálculo de percentual, o truque é remover a dimensão do denominador e manter a do numerador. Confira qual coluna o ALL está zerando.
Qual a diferença entre passar UF = "SP" e usar FILTER?
O filtro simples é mais legível e costuma ser mais rápido, porque o motor o resolve na dimensão. O FILTER é para condições que um filtro simples não expressa, como comparações com medidas ou lógica entre colunas. A regra prática: comece pelo filtro simples e só recorra ao FILTER quando a condição exigir.
O que é transição de contexto, em uma frase? É o momento em que CALCULATE transforma o contexto de linha atual em contexto de filtro, o que acontece automaticamente toda vez que você chama uma medida dentro de um iterador ou de uma coluna calculada. É o comportamento que faz uma medida "conhecer" a linha em que está sendo avaliada.
CALCULATE resolve problemas de modelo ruim? Não, e essa é a resposta honesta. CALCULATE compensa lacunas por um tempo, mas a conta chega em forma de medidas gigantes, lentidão e números que ninguém consegue explicar. Se você está usando CALCULATE para contornar relacionamentos errados ou falta de tabela de datas, o certo é arrumar o modelo. Um assessment do ambiente costuma revelar que o gargalo estava na modelagem, não nas fórmulas.
Fechando
CALCULATE não é uma função a mais no catálogo do DAX: é a função que dá à linguagem o poder de analisar, e não só de somar. Domine a ideia de que ela reescreve o contexto de filtro antes de calcular, entenda que filtro na mesma coluna substitui e em colunas diferentes cruza, respeite a transição de contexto e prefira filtros simples. Com esses quatro pontos você escreve 90% das medidas que um projeto precisa, e escreve de um jeito que a próxima pessoa consegue manter.
Se a sua equipe está travada em medidas que ninguém entende, relatórios lentos ou números que não fecham, esse costuma ser o sintoma de um modelo que pede ajuste. Fale com a gente e a gente ajuda a colocar seu Power BI em ordem, do modelo à medida.
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