O CALCULATE é, sem dúvida, a função mais importante do DAX. Quem aprende a usá-la de verdade desbloqueia um nível completamente diferente de análise no Power BI. Mas ela também confunde muito gente no começo — porque exige entender um conceito que não existe no Excel: o contexto de filtro.

O conceito de contexto de filtro

No Power BI, toda medida DAX é calculada dentro de um contexto de filtro — o conjunto de filtros ativos que determinam quais linhas da tabela são consideradas no cálculo. Esse contexto vem das segmentações de dados, dos filtros de página, dos visuais e até da própria posição da medida em uma tabela ou gráfico.

O CALCULATE é a única função DAX capaz de modificar esse contexto de filtro. Com ela você pode adicionar filtros, removê-los ou substituí-los antes do cálculo ser executado.

Sintaxe do CALCULATE

CALCULATE(expressão; [filtro1]; [filtro2]; ...)

Exemplos práticos

Total de vendas apenas de um produto

Vendas Notebook = CALCULATE(SUM(Vendas[Valor]); Vendas[Produto] = "Notebook")

Independente de qual segmentação o usuário selecionar, essa medida sempre filtra para mostrar apenas vendas de Notebook.

Porcentagem sobre o total geral (ignorando filtros)

% do Total = DIVIDE(SUM(Vendas[Valor]); CALCULATE(SUM(Vendas[Valor]); ALL(Vendas)))

O ALL(Vendas) remove todos os filtros da tabela Vendas, fazendo o denominador ser sempre o total geral, não o total filtrado.

Vendas do mês anterior

Vendas Mês Anterior = CALCULATE(SUM(Vendas[Valor]); DATEADD(Calendario[Data]; -1; MONTH))

CALCULATE com ALL, FILTER e REMOVEFILTERS

Perguntas frequentes

Qual a diferença entre CALCULATE e CALCULATETABLE?

CALCULATE retorna um valor escalar (número, texto). CALCULATETABLE retorna uma tabela. Use CALCULATETABLE quando precisa de uma tabela filtrada para usar dentro de outras funções como COUNTROWS ou SUMX.

Por que minha medida com CALCULATE parece ignorar a segmentação?

Provavelmente porque você usou ALL() ou REMOVEFILTERS() em uma coluna que está sendo filtrada pela segmentação. Isso é o comportamento esperado. Se quiser preservar o filtro da segmentação, use ALLEXCEPT() em vez de ALL().

CALCULATE funciona fora de medidas?

Não. CALCULATE só funciona dentro de medidas, não em colunas calculadas (porque no contexto de linha não existe contexto de filtro).