Em DAX, a diferença entre um modelo “que funciona” e um modelo inteligente e confiável está nos detalhes.
Todo mundo conhece as clássicas, CALCULATE
, FILTER
, SUMX
, mas poucas pessoas exploram as funções que permitem refinar o contexto de filtro, modelar exceções e ajustar comportamentos que o DAX padrão não cobre sozinho.
Neste artigo, vamos mergulhar em 5 funções menos conhecidas, mas de alto impacto, com explicações práticas e exemplos que você pode começar a aplicar hoje mesmo.
1. KEEPFILTERS()
: Quando você quer somar sem apagar o que já existe
O que ela faz
Dentro de um CALCULATE
, o comportamento padrão do DAX é substituir filtros existentes por novos.
O KEEPFILTERS()
muda essa regra: ele mantém os filtros aplicados externamente (pelo visual, segmentação ou interação do usuário) e adiciona novos filtros sem “resetar” o que já estava ativo.
Quando usar
Quando você quer refinar o filtro atual, e não substituí-lo.
Exemplo
Imagine que o usuário filtrou o período de janeiro a março, mas você quer somar apenas as vendas com status “Ativa”, respeitando o período aplicado.
VendasAtivas =
CALCULATE(
SUM(Vendas[Valor]),
KEEPFILTERS(Vendas[Status] = "Ativa")
)
Sem KEEPFILTERS
, o DAX poderia ignorar o filtro visual de período, retornando resultados incorretos.
Com ele, os dois filtros coexistem, e o resultado é consistente com o que o usuário está vendo.
2. TREATAS()
: Criando relacionamentos virtuais entre tabelas
O que ela faz
TREATAS()
aplica uma tabela virtual como filtro em outra tabela, mesmo que não exista relacionamento físico entre elas no modelo.
Quando usar
Quando você precisa cruzar informações sem criar relacionamentos diretos, evitando confusão no modelo ou impacto na performance.
Exemplo
Você tem uma tabela de Campanhas
e outra de Clientes
, sem relacionamento direto, mas quer listar apenas os clientes que participaram de determinadas campanhas.
ClientesCampanha =
CALCULATETABLE(
Clientes,
TREATAS(Campanhas[ClienteID], Clientes[ClienteID])
)
Aqui, o TREATAS
cria um relacionamento temporário apenas durante a execução da medida,
permitindo análises complexas sem poluir o modelo de dados.
3. CROSSFILTER()
: Mudando a direção do relacionamento em tempo real
O que ela faz
O CROSSFILTER()
altera a direção do relacionamento entre duas tabelas (para BOTH
, ONEWAY
ou NONE
) dentro de uma medida específica.
Quando usar
Quando a direção de filtro padrão atrapalha o cálculo, e você quer temporariamente inverter o fluxo de relação sem mudar o modelo físico.
Exemplo
O modelo padrão tem um relacionamento de FatoVendas
→ DimProduto
(somente um sentido).
Mas em uma medida específica, você precisa que o produto também filtre as vendas.
VendasPorCategoria =
CALCULATE(
SUM(Vendas[Valor]),
CROSSFILTER(Vendas[ProdutoID], Produtos[ProdutoID], BOTH),
Produtos[Categoria] = "Carnes Premium"
)
Aqui, o filtro passa a fluir nos dois sentidos, permitindo cálculos mais granulares, sem alterar o relacionamento original.
4. ISINSCOPE()
: Tornando medidas sensíveis ao contexto do visual
O que ela faz
O ISINSCOPE()
verifica se uma coluna está sendo usada no nível de agrupamento atual no visual.
Em outras palavras, ele pergunta: “Estou dentro do escopo dessa coluna?”
Quando usar
Quando você precisa que uma medida mude seu comportamento conforme o nível de detalhe exibido (por exemplo, total geral vs por categoria).
Exemplo
Você quer mostrar o crescimento percentual apenas quando o dado for exibido por categoria, não no total geral.
CrescimentoDinâmico =
IF(
ISINSCOPE(DimCategoria[NomeCategoria]),
(SUM(Vendas[Valor]) - SUM(Vendas[Valor Anterior])) / SUM(Vendas[Valor Anterior]),
BLANK()
)
Se a categoria estiver em escopo, ele calcula o crescimento.
Se não estiver (como em um total geral), a medida se adapta.
Isso evita confusões e mantém o visual limpo e preciso.
5. ALLSELECTED()
: Percentuais e totais relativos ao filtro do usuário
O que ela faz
O ALLSELECTED()
retorna todos os valores selecionados no filtro visual, ignorando filtros internos da medida, mas respeitando o contexto aplicado pelo usuário.
Quando usar
Quando você quer calcular percentuais com base no total filtrado pelo usuário, não no total global.
Exemplo
Você quer exibir a participação de cada produto dentro do total filtrado no visual:
Participação (% do Filtrado) =
DIVIDE(
SUM(Vendas[Valor]),
CALCULATE(SUM(Vendas[Valor]), ALLSELECTED(Vendas[ProdutoID]))
)
Assim, o percentual será sempre relativo ao que o usuário vê no momento,
e não ao total geral, garantindo uma experiência interativa e contextual.
💡 Reflexão técnica
Você pode decorar 100 funções DAX e ainda assim cometer erros que arruínam a credibilidade do seu modelo.
É comum ver medidas que funcionam em um visual e quebram em outro, ou que retornam resultados diferentes dependendo do contexto.
O problema não está na função, está na interpretação do contexto.
Saber DAX é diferente de pensar em DAX.
Quem entende o motor por trás do cálculo, linha por linha, filtro por filtro, enxerga além da fórmula.
Sabe quando o modelo está coerente.
E, principalmente, sabe quando o número não faz sentido, mesmo que o Power BI diga que faz.
As funções que vimos aqui são poderosas, mas só fazem sentido quando o analista entende o ecossistema completo do cálculo.
No fim, o DAX é apenas a linguagem.
O que realmente importa é o pensamento analítico que você constrói com ela.
Sem comentários! Seja o primeiro.