Como fazer Top N Dinâmico em Power BI: passo a passo
Este tutorial mostra como criar um Top N dinâmico em Power BI controlado por um slicer, útil para destacar os principais clientes, produtos ou categorias e agregar o restante em 'Others'. Explica o porquê e dá passos práticos com DAX e modelação simples.
Pré-requisitos
- Power BI Desktop (versão recente).
- Uma tabela de vendas com colunas: CustomerName, Product, SalesAmount, OrderDate.
- Noções básicas de relações, tabelas e medidas DAX.
Passo 1: Preparar a tabela de ranking
Precisamos de uma tabela para selecionar o N (Top 3, Top 10, etc.). Cria uma tabela de parâmetros no Power BI com números que façam sentido para o teu relatório.
TopN = GENERATESERIES(1, 20, 1)
Depois converte-a num slicer no relatório para o utilizador escolher o N. Esta tabela está desligada (não precisa de relações) e serve para filtragem via medidas DAX.
Passo 2: Medida de total de vendas
Cria uma medida base com o total de vendas. Esta serve como referência para ranking e filtros.
Total Sales = SUM(Sales[SalesAmount])
Passo 3: Medida de ranking por dimensão
Vamos criar uma medida que calcula o rank de cada membro (ex.: CustomerName) ordenado por Total Sales. Usamos RANKX com ALLSELECTED para respeitar slicers relevantes.
Customer Rank =
RANKX(
ALLSELECTED(Customer[CustomerName]),
CALCULATE([Total Sales]),
,
DESC,
DENSE
)
Passo 4: Medida que identifica Top N
Com o rank e o valor de TopN seleccionado, criamos uma medida booleana que indica se um cliente está no Top N escolhido.
Is TopN =
VAR SelectedN = SELECTEDVALUE(TopN[Value], 5)
RETURN
IF([Customer Rank] <= SelectedN, 1, 0)
Passo 5: Medida para agrupar 'Others'
Queremos mostrar os Top N individualmente e somar o restante em 'Others'. Cria uma medida que devolve o valor do cliente se estiver no Top N ou agrega para 'Others'.
TopN Sales =
VAR IsTop = [Is TopN]
RETURN
IF(
IsTop = 1,
[Total Sales],
BLANK()
)
Others Sales =
VAR SelectedN = SELECTEDVALUE(TopN[Value], 5)
VAR TableAll =
ADDCOLUMNS(
VALUES(Customer[CustomerName]),
"Rank", [Customer Rank],
"Sales", [Total Sales]
)
VAR OthersSum =
SUMX(
FILTER(TableAll, [Rank] > SelectedN),
[Sales]
)
RETURN
IF(HASONEVALUE(Customer[CustomerName]) = FALSE(), OthersSum, BLANK())
Passo 6: Construir o visual com 'Others'
Usa uma tabela ou gráfico de colunas. Coloca Customer[CustomerName] e a medida TopN Sales. Para incluir 'Others' no mesmo visual, cria uma tabela auxiliar virtual com os Top N e uma linha 'Others' ou usa um visual combinado:
// Exemplo simplificado para tabela virtual num visual de tabela
Display Name =
IF([Is TopN] = 1, SELECTEDVALUE(Customer[CustomerName]), "Others")
Display Sales =
IF([Is TopN] = 1, [Total Sales], CALCULATE([Others Sales]))
Se preferires, cria uma tabela resumida com SUMMARIZE e usa-a num visual com a função 'Display Name' e 'Display Sales'.
Passo 7: Tratar empates e performance
Empates no ranking podem duplicar posições; usando DENSE evita saltos, mas podes usar SKIP para outro comportamento. Para performance, limita ALLSELECTED a uma coluna concreta e evita iteradores desnecessários em grandes volumes.
Verificar o resultado
Selecciona diferentes valores no slicer TopN e verifica que o visual actualiza: os N primeiros aparecem individualmente e o total das restantes entidades aparece como 'Others'. Confirma que os totais coincidem com o Total Sales geral e testa com diferentes filtros (data, produto) para garantir que ALLSELECTED respeita os slicers desejados.
Conclusão
O Top N dinâmico em Power BI permite dar foco aos principais itens mantendo contexto com os restantes agregados. Próximos passos: experimentar com Top N por produto, combinar com variáveis de tempo e criar bookmarks para opções predefinidas. Dica: usa tooltips para explicar ao utilizador o que representa 'Others' e evitar confusão.