Selo de estado:
Preview(teto atual do produto) · Curso ACD-320 — Fórmulas pt-BR: de SOMA a CALCULAR · Aula 7 de 13 · Atualizado em 2026-10-04.
Objetivo#
Ao final desta aula você vai calcular linha a linha (margem por item).
Vídeo#
Identificador no manifesto: acd-320-07-iteradores-x · duração-alvo 8 min · tela do produto: /dashboards.
Roteiro:
| # | Capítulo | Minutagem-alvo | Rota |
|---|---|---|---|
| 1 | Abertura — quando SOMA(valor - custo) não dá a margem certa | 00:00–01:00 | /dashboards |
| 2 | Transição de contexto, revisitada | 01:00–02:20 | /dashboards |
| 3 | SOMAX, MEDIAX, CONTX, MAXX e MINX — os cinco iteradores numéricos | 02:20–05:40 | /dashboards (biblioteca de medidas) |
| 4 | JUNTARX — texto a partir de várias linhas | 05:40–06:50 | /dashboards (editor de fórmulas) |
| 5 | O 2º argumento FILTRAR(...) dos iteradores | 06:50–07:30 | /dashboards (editor de fórmulas) |
| 6 | Encerramento — "faça você mesmo" | 07:30–08:00 | /dashboards |
Conteúdo#
Até aqui toda agregação somou uma coluna inteira de uma vez (SOMA(valor)). Os iteradores desta aula fazem diferente: calculam uma expressão linha a linha e só então agregam o resultado — é a transição de contexto da aula 5 em ação, e é a única forma certa de calcular "receita = quantidade × preço" quando quantidade e preço vêm de linhas diferentes dentro do mesmo grupo.
Por que SOMA(valor - custo) não basta
Se valor e custo já estão na mesma linha, SOMA(valor - custo) até funciona (o motor calcula a coluna linha a linha e soma o resultado). Mas se a margem depende de multiplicar duas colunas — quantidade * preco — e o grupo tem várias linhas com quantidade e preco diferentes, só um iterador garante que a multiplicação aconteça dentro de cada linha, antes de agregar.
SOMAX — soma o resultado linha a linha
SOMAX(expr; [arg2])DIFERE do DAX: a tabela virtual do 1º/2º argumento só pode ser FILTRAR(...) — o SUMX do DAX aceita qualquer expressão de tabela.
SOMAX(qtd * preco)| Entrada | Fórmula | Resultado |
|---|---|---|
| (q=2,p=10) e (q=3,p=20) | SOMAX(q * p) | 80 |
Alias: sumx.
MEDIAX, CONTX, MAXX, MINX — a mesma ideia, agregação diferente
MEDIAX(expr; [arg2])
CONTX(expr; [arg2])
MAXX(expr; [arg2])
MINX(expr; [arg2])Todas avaliam a expressão linha a linha e trocam só o jeito de agregar o resultado: média, contagem de linhas com valor não vazio, maior e menor.
MEDIAX(valor - custo)CONTX(SE(valor - custo > 0; 1))MAXX(valor - custo)MINX(valor - custo)CONTX conta quantas linhas a expressão devolveu um valor não vazio — no exemplo acima, quantos itens deram lucro positivo. MAXX/MINX não têm alias em português além do próprio nome.
JUNTARX — texto, não número
JUNTARX(expr; [arg2]; [arg3])DIFERE do DAX: não tem argumento de ordenação (o CONCATENATEX aceita orderBy). Junta num texto só o resultado de cada linha, com o separador informado.
JUNTARX(categoria; ", ")O 2º argumento: uma tabela virtual FILTRAR(...)
Com dois argumentos, o primeiro continua sendo a expressão calculada linha a linha; quando você quer um iterador sobre um subconjunto, o segundo argumento precisa ser FILTRAR(...) — passar uma condição solta ali é um erro guiado, não um FILTER com tabela arbitrária como no DAX. Por exemplo, para somar a margem só dos itens do canal loja:
SOMAX(valor - custo; FILTRAR(canal = "loja"))Um exemplo numérico, passo a passo
Pense em duas linhas do grupo "categoria Bebidas": a primeira com qtd = 2 e preco = 10; a segunda com qtd = 3 e preco = 20. SOMAX(qtd * preco) calcula 2 * 10 = 20 na primeira linha, 3 * 20 = 60 na segunda, e soma: 20 + 60 = 80. Compare com o erro clássico de quem tenta evitar o iterador: SOMA(qtd) * SOMA(preco) daria 5 * 30 = 150 — um número sem relação com a receita real, porque a multiplicação aconteceu depois de somar as colunas inteiras, não linha a linha. Esse é o motivo de existir uma função separada para iterar: a ordem "multiplica, depois soma" só é garantida pela transição de contexto.
As seis funções, resumidas
| Função | Agrega como | Retorno |
|---|---|---|
SOMAX | soma | Número |
MEDIAX | média | Número |
CONTX | contagem de não vazios | Número |
MAXX | maior | Número |
MINX | menor | Número |
JUNTARX | concatenação com separador | Texto |
Todas compartilham a mesma regra de 2º argumento (FILTRAR(...) quando presente) e a mesma garantia de branco honesto: sem linha no contexto, o resultado é vazio, nunca zero.
Erros comuns
SOMAX(vendas.qtd * vendas.preco)Mesmo erro da aula 1: coluna sempre pelo nome simples, nunca
tabela.coluna—Caractere inesperado: ".".
- Usar
SOMA(qtd * preco)em vez deSOMAX(qtd * preco)— ambas podem até compilar e, em alguns casos, dar o mesmo número, mas só o iterador garante a multiplicação linha a linha quando o grupo tem muitas linhas heterogêneas. - Esperar que o 2º argumento aceite uma condição solta — precisa ser
FILTRAR(...).
Estado da capacidade
A transição de contexto e os iteradores sobre tabela virtual (C06.3) estão em Preview, cobertos por suíte de testes determinística.
Faça você mesmo#
No workspace de treino Aurora Varejo (abra /dashboards no console):
- Crie a medida Margem por item com
SOMAX(valor - custo). - Compare o resultado com
SOMA(valor) - SOMA(custo)— neste caso os dois batem porque a subtração já está na mesma linha; mude a fórmula paraSOMAX(qtd * preco)e tente reproduzir sem iterador para sentir a diferença. - Crie
MAXX(valor - custo)para achar a venda de maior margem absoluta do grupo. - Monte
MEDIAX(valor - custo)para a margem média por linha eJUNTARX(produto; "; ")num cartão, para ver a lista de produtos que compõem o grupo.
Você terminou quando a medida Margem por item existir com SOMAX e você conseguir explicar por que um iterador foi necessário (e não bastava SOMA).
Checagem rápida#
Três perguntas no final da aula, corrigidas no servidor. A aula só conta como concluída depois da checagem.
Documentação relacionada#
Capacidades ensinadas#
C06.3 — o selo exibido na aula é sempre o estado mais conservador entre as capacidades citadas; nada aqui é "GA".