Como usar a função RELATED em DAX: passo a passo
A função RELATED em DAX serve para ir buscar um valor de outra tabela seguindo uma relação que já existe no teu modelo. É especialmente útil num modelo em estrela, em que a tabela de factos (as vendas) está separada das dimensões (produtos, clientes ou datas). Com um exemplo simples de vendas e produtos, vais aprender a usar RELATED para colocar o preço e a categoria certos em cada linha de venda.
Pré-requisitos
- O Power BI Desktop instalado (a função também existe no Power Pivot do Excel e no Analysis Services).
- Duas tabelas no modelo: uma de factos,
Sales, e uma de dimensão,Products. - Uma relação entre as duas tabelas, ligada por uma coluna comum como
ProductID. - Saber criar uma coluna calculada (basta um clique com o botão direito na tabela).
Passo 1: Perceber o modelo de dados
Imagina duas tabelas. A tabela Sales regista cada linha de encomenda e tem as colunas ProductID e Quantity. A tabela Products descreve cada artigo e tem ProductID, ProductName, Category e UnitPrice. Entre elas há uma relação muitos-para-um: muitas vendas apontam para o mesmo produto.
O objetivo é comum: queres saber o total de cada linha de venda (quantidade × preço), mas o preço está na tabela Products e não na tabela Sales. É exatamente para isto que existe a função RELATED.
Passo 2: Confirmar que existe uma relação
RELATED só funciona se houver uma relação entre as tabelas. Abre a vista Modelo no Power BI Desktop e confirma que existe uma linha a ligar Sales[ProductID] a Products[ProductID]. O lado "um" é a tabela Products (cada produto aparece uma vez) e o lado "muitos" é a tabela Sales.
RELATED segue sempre a relação do lado "muitos" para o lado "um". Ou seja, é chamada a partir da tabela de factos para ir buscar valores à dimensão.
Passo 3: Criar uma coluna calculada com RELATED
Seleciona a tabela Sales, cria uma nova coluna e escreve a fórmula abaixo. Ela traz o preço unitário do produto correspondente para dentro da tabela de vendas:
UnitPrice = RELATED( Products[UnitPrice] )
Repara que só indicas a coluna que queres — Products[UnitPrice]. Não precisas de dizer qual é a relação a usar: o DAX descobre o caminho sozinho, porque a relação já existe no modelo.
Passo 4: Calcular o total de cada linha
Com o preço disponível em cada linha, já podes calcular o valor de cada venda. Cria outra coluna calculada na tabela Sales:
LineTotal = Sales[Quantity] * RELATED( Products[UnitPrice] )
Isto funciona porque uma coluna calculada tem row context (contexto de linha): o DAX sabe em que linha está e, por isso, sabe qual o produto a procurar. Da mesma forma, podes trazer a categoria para depois agrupar as vendas:
Category = RELATED( Products[Category] )
Passo 5: Usar RELATED dentro de uma medida com SUMX
Nem sempre queres criar colunas físicas. Podes usar RELATED dentro de um iterador como o SUMX, que percorre a tabela linha a linha e cria, em cada uma, o row context de que RELATED precisa:
Total Sales =
SUMX(
Sales,
Sales[Quantity] * RELATED( Products[UnitPrice] )
)
Esta medida devolve o total de vendas sem ocupar espaço com colunas calculadas — uma boa prática em modelos grandes.
Passo 6: Erro comum e a função inversa
Um erro frequente é usar RELATED numa medida simples, do género = RELATED( Products[UnitPrice] ). Não resulta: uma medida não tem contexto de linha e o DAX devolve erro. Usa RELATED apenas em colunas calculadas ou dentro de iteradores (SUMX, AVERAGEX, FILTER e afins).
Se precisares do sentido contrário — do lado "um" para o lado "muitos" — usa RELATEDTABLE. Por exemplo, para contar quantas vendas cada produto teve, cria esta coluna na tabela Products:
NumSales = COUNTROWS( RELATEDTABLE( Sales ) )
Verificar o resultado
Cria uma tabela visual com Products[ProductName] e a medida Total Sales. Os valores devem coincidir com a soma manual de quantidade × preço de cada produto. Confirma também a coluna LineTotal: escolhe uma linha qualquer e vê se o resultado é mesmo a quantidade multiplicada pelo UnitPrice desse produto. Se aparecer (Blank) ou um erro, verifica se a relação existe e se os valores de ProductID têm correspondência nas duas tabelas.
Conclusão
Aprendeste a usar a função RELATED para trazer valores de uma dimensão para a tabela de factos seguindo as relações do modelo, e a usar RELATEDTABLE para o caminho inverso. O passo seguinte é combinar RELATED com CALCULATE para criar métricas mais ricas, ou aprofundar como o row context e o filter context se relacionam. Qual vai ser a primeira coluna que vais deixar de copiar à mão graças ao RELATED?