Chegar no nível sênior em DAX não é apenas memorizar funções — é reconhecer padrões e escrever medidas que qualquer colega consegue manter. Variáveis, CALCULATE composto, e padrões estabelecidos pela comunidade DAX são o que separa fórmulas que funcionam de fórmulas que funcionam e são sustentáveis.
VAR: variáveis em DAX
VAR define um nome para um valor calculado que pode ser reutilizado dentro da mesma expressão. Dois benefícios: legibilidade e performance (o valor é calculado uma vez).
Análise de Crescimento =
VAR VendasAtual = [Total Vendas]
VAR VendasAnterior = CALCULATE([Total Vendas];
SAMEPERIODLASTYEAR(dCalendario[Data]))
VAR Variacao = VendasAtual - VendasAnterior
RETURN
IF(
ISBLANK(VendasAnterior);
BLANK();
DIVIDE(Variacao; VendasAnterior)
)
Cada VAR é calculado apenas uma vez. RETURN define o que a medida retorna — pode referenciar qualquer VAR definida acima.
CALCULATE aninhado: filtros empilhados
Você pode aninhar CALCULATE para aplicar múltiplas camadas de contexto:
-- Vendas do produto mais vendido da categoria selecionada
Vendas Top Produto da Categoria =
VAR TopProduto =
TOPN(1; VALUES(Produtos[Nome]); [Total Vendas]; DESC)
RETURN
CALCULATE([Total Vendas]; TopProduto)
O CALCULATE interno captura o TOP produto; o RETURN usa isso como filtro para calcular as vendas.
Padrão semi-aditivo: saldo de estoque/conta
Métricas semi-aditivas não devem ser somadas ao longo do tempo — o saldo de estoque de 12 meses não é a soma dos 12 saldos, é o último. Use LASTDATE ou LASTNONBLANK:
Saldo Estoque =
CALCULATE(
SUM(Estoque[Quantidade]);
LASTDATE(dCalendario[Data])
)
Em um gráfico por mês, cada mês mostra o saldo do último dia do mês, não a soma.
Padrão de análise de coorte
Análise de coorte responde: "dos clientes que compraram em janeiro de 2025, quantos ainda compraram em fevereiro, março..." Uma versão simplificada:
Retenção de Coorte =
VAR MêsAquisição = MIN(Clientes[MêsPrimeira Compra])
VAR ClientesDoCoorte =
FILTER(ALL(Clientes); Clientes[MêsPrimeira Compra] = MêsAquisição)
RETURN
DIVIDE(
CALCULATE(DISTINCTCOUNT(Pedidos[ID_Cliente]); ClientesDoCoorte);
CALCULATE(DISTINCTCOUNT(Clientes[ID_Cliente]); ClientesDoCoorte)
)
ISINSCOPE: comportamento diferente no total
ISINSCOPE(coluna) retorna VERDADEIRO quando a coluna está no contexto de linha de uma matriz — útil para mostrar valores diferentes nas linhas detalhadas vs. no subtotal:
Margem Exibida =
IF(ISINSCOPE(Produtos[Nome]); [Margem %]; [Margem % Total Ponderada])
Perguntas frequentes
Variáveis DAX são avaliadas no momento da declaração ou do RETURN?
No momento da declaração. O contexto de filtro no momento do VAR é capturado — se o contexto mudar depois (por um CALCULATE subsequente), a variável não muda. Isso é uma fonte comum de confusão em medidas complexas.
Existe um limite de variáveis em uma medida DAX?
Não há limite documentado. Na prática, medidas com mais de 10-15 variáveis começam a ficar difíceis de manter — considere dividir em múltiplas medidas auxiliares.