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
ALL(tabela)— remove todos os filtros da tabela (ignora segmentações)ALLEXCEPT(tabela; coluna1; coluna2)— remove todos os filtros exceto nas colunas especificadasALLSELECTED(tabela)— remove filtros internos mas mantém os filtros de segmentações do usuário. Útil para % do total selecionado.
% 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.