Módulo 7: DAX essencial: contexto é tudo

Aula 4 de 4

CALCULATE: a função central do DAX

O que ele realmente faz com o contexto, e a ordem em que as coisas acontecem.

20 minutos de leitura


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

ModificadorEfeito
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] ) ))

Exercício prático

Crie as três medidas de participação (% do Total Geral, % do Total Visível e % da Categoria) e monte uma matriz com Categoria e Subcategoria. Aplique uma segmentação de categoria e explique a diferença entre os três resultados.