As funções iteradoras do DAX são as que elevam análises de "soma e conta" para cálculos complexos: ranking dinâmico, top N de produtos, margem calculada linha a linha, contribuição percentual. Estas funções operam sobre tabelas virtuais — entendê-las é essencial para DAX de nível avançado.

Como funcionam os iteradores

Funções como SUMX, AVERAGEX, MAXX, MINX e RANKX recebem dois argumentos: uma tabela e uma expressão. O DAX itera linha a linha sobre a tabela, avalia a expressão em cada linha (com contexto de linha), e agrega os resultados.

A diferença de SUM para SUMX:

-- SUM: soma direta de uma coluna
Total Vendas = SUM(Pedidos[Valor])

-- SUMX: calcula expressão por linha, depois soma
Receita Calculada = SUMX(Pedidos; Pedidos[Qtd] * Pedidos[PreçoUnit])

Use SUMX quando o valor que quer somar não existe como coluna — precisa ser calculado.

RANKX: ranking dinâmico

RANKX(tabela; expressão; [valor]; [ordem]; [empates])

Rank Vendedor =
RANKX(
    ALL(Vendedores[Nome]);
    [Total Vendas];;
    DESC;
    Dense
)

ALL(Vendedores[Nome]) remove o contexto de filtro do nome do vendedor — sem ALL, o RANKX compararia o vendedor só consigo mesmo e sempre retornaria 1. Dense significa que empates não pulam posições (1,2,2,3 em vez de 1,2,2,4).

TOPN: os N maiores

-- Retorna os 5 produtos com maior receita
Top5Produtos =
TOPN(5; Produtos; [Total Vendas]; DESC)

TOPN retorna uma tabela — use dentro de CALCULATE para filtrar por ela:

Vendas Top5 =
CALCULATE(
    [Total Vendas];
    TOPN(5; ALL(Produtos[Nome]); [Total Vendas]; DESC)
)

ADDCOLUMNS: construindo tabelas virtuais

ADDCOLUMNS cria uma tabela com colunas extras calculadas. Use dentro de outras funções:

Análise por Região =
ADDCOLUMNS(
    VALUES(Regiões[Nome]);
    "Vendas"; [Total Vendas];
    "Meta"; [Total Meta];
    "Atingimento %"; DIVIDE([Total Vendas]; [Total Meta])
)

Essa tabela virtual pode ser passada para SUMX, FILTER, TOPN, etc.

ALL, ALLEXCEPT e ALLSELECTED

% do Total Selecionado =
DIVIDE([Total Vendas]; CALCULATE([Total Vendas]; ALLSELECTED(Produtos)))

Perguntas frequentes

SUMX é mais lento que SUM?

Sim, porque itera linha a linha. Para somas simples de colunas existentes, SUM é sempre preferível. Use SUMX apenas quando o cálculo precisa ser feito linha a linha antes da agregação.

RANKX retorna o mesmo rank em tabelas filtradas?

Depende do primeiro argumento. Com ALL(), o rank é calculado sobre todos os dados independente do filtro. Com VALUES() ou a tabela direto, o rank é calculado apenas dentro do contexto filtrado atual.