CALCULATE avalia uma expressão em um contexto de filtro modificado. Essa frase resume toda a linguagem. Tudo que é difícil em DAX é, no fundo, uma pergunta sobre o que CALCULATE fez com o contexto.
DAXSintaxe
CALCULATE( <expressão>, <filtro1>, <filtro2>, ...)O que acontece com o contexto existente
Por padrão, um filtro escrito em CALCULATE SUBSTITUI o filtro existente naquela coluna e MANTÉM os filtros das demais colunas.
DAXSubstituição de filtro
-- Se o visual está filtrado em Categoria = "Bebidas" e Ano = 2025,-- esta medida devolve Alimentos de 2025 (a categoria é substituída, o ano permanece).Receita Alimentos =CALCULATE( [Receita Total], dProduto[Categoria] = "Alimentos" )DAXSomando ao filtro em vez de substituir
-- KEEPFILTERS respeita o filtro que já existia: se o usuário-- selecionou "Bebidas", o resultado fica em branco (interseção vazia).Receita Alimentos (respeitando) =CALCULATE( [Receita Total], KEEPFILTERS( dProduto[Categoria] = "Alimentos" ))Os modificadores de filtro
| Modificador | Efeito |
|---|---|
| REMOVEFILTERS(tabela ou coluna) | Remove os filtros — a forma moderna de ALL dentro de CALCULATE |
| ALL(tabela) | Ignora todos os filtros da tabela |
| ALLEXCEPT(tabela, colunas) | Ignora tudo, exceto as colunas listadas |
| ALLSELECTED() | Respeita o que o usuário selecionou, ignora o que o visual filtrou |
| KEEPFILTERS(filtro) | Interseção com o filtro existente em vez de substituição |
| USERELATIONSHIP(c1, c2) | Ativa um relacionamento inativo durante o cálculo |
| CROSSFILTER(c1, c2, direção) | Muda a direção do filtro durante o cálculo |
DAXParticipação no total — o caso mais pedido
-- % sobre o total geral, ignorando qualquer filtro de produto% do Total Geral =DIVIDE( [Receita Total], CALCULATE( [Receita Total], REMOVEFILTERS( dProduto ) )) -- % sobre o total do que está visível/selecionado no visual% do Total Visível =DIVIDE( [Receita Total], CALCULATE( [Receita Total], ALLSELECTED( dProduto ) )) -- % dentro da categoria (a subcategoria varia, a categoria fica fixa)% da Categoria =DIVIDE( [Receita Total], CALCULATE( [Receita Total], ALLEXCEPT( dProduto, dProduto[Categoria] ) ))