Como criar uma coluna de categoria dinâmica em DAX: passo a passo
Este tutorial mostra como criar uma coluna calculada em DAX que classifica produtos ou transacções em categorias dinâmicas (por exemplo: "Top", "Médio", "Baixo") com base em regras de negócio como vendas e margem. Uma coluna de categoria ajuda a segmentar análises no Power BI e a criar filtros e visuais mais úteis. Vamos explicar o porquê de escolher uma coluna calculada vs. uma medida e dar um exemplo prático, com valores concretos e atenção ao desempenho.
Pré-requisitos
- Power BI Desktop ou Tabular model com uma tabela de factos (por exemplo, Sales) e uma tabela de produtos (Products).
- Conhecimentos básicos de DAX: medidas, colunas calculadas e funções como RELATED, CALCULATE, IF e VAR.
- Uma coluna de vendas (Sales[Amount]) e, opcional, margem (Sales[Margin] ou cálculo equivalente).
- Uma tabela de datas bem populada (Date) se for usar Time Intelligence; relações entre Sales[ProductID] e Products[ProductID] correctamente definidas.
Passo 1: Definir a regra de categorização
Antes de escrever DAX, decida as regras. Regras bem definidas evitam lógica ambígua e permitem testes. Exemplo prático: categorizar produtos por Vendas Totais nos últimos 12 meses (L12M) e Margem média ponderada. Critérios propostos:
- "Top": Vendas L12M > €100.000 e Margem média >= 20%.
- "Médio": Vendas L12M entre €20.000 e €100.000 (inclusive, média de margem indiferente).
- "Baixo": Vendas L12M <= €20.000 ou ausência de vendas.
Estes thresholds são exemplos; em contexto real deve basear-se em percentis (p.ex. top 10% dos produtos) ou na estratégia da empresa. Decidir se a categorização deve ser estática (coluna calculada) ou dinâmica em função do filtro temporal (medida) é crucial — aqui mostramos a coluna calculada usando medidas agregadas para capturar L12M.
Passo 2: Criar uma medida para Vendas Totais (se ainda não existir)
Uma medida é necessária para cálculo consistente com contexto. Medidas são eficientes quando usadas em visuais e suportam filtros automaticamente.
Sales Total = SUM(Sales[Amount])
Passo 3: Criar uma medida para Vendas últimos 12 meses
Usar Time Intelligence permite comparar períodos e evita duplicar lógica. Supondo que tem uma tabela Date com colunas contínuas, use DATESINPERIOD para calcular L12M. Isto garante que, se o utilizador aplicar um slicer de datas, a medida responde correctamente.
Sales L12M =
CALCULATE(
[Sales Total],
DATESINPERIOD('Date'[Date], MAX('Date'[Date]), -12, MONTH)
)
Passo 4: Criar uma medida para Margem média por produto (opcional)
Uma margem média ponderada por vendas é mais representativa que uma média simples. Use DIVIDE para evitar erro de divisão por zero. Se a empresa guarda margem como valor monetário (MarginAmount), calcule a percentagem agregada assim:
Margin Avg =
DIVIDE(
SUM(Sales[MarginAmount]),
SUM(Sales[Amount]),
0
)
O terceiro argumento de DIVIDE devolve 0 quando o denominador é zero. Em cenários reais, podemos querer BLANK() para sinalizar falta de dados.
Passo 5: Criar uma coluna calculada de categoria na tabela Products
Agora criamos a coluna calculada em Products que avalia cada productID usando as medidas agregadas. Como as medidas dependem do contexto de linha, usamos CALCULATE com FILTER para forçar o contexto por produto. Este padrão é comum quando precisa de materializar a categoria por produto.
Product Category =
VAR vSales =
CALCULATE([Sales L12M], FILTER(ALL(Sales), Sales[ProductID] = Products[ProductID]))
VAR vMargin =
CALCULATE([Margin Avg], FILTER(ALL(Sales), Sales[ProductID] = Products[ProductID]))
RETURN
IF(
vSales > 100000 && vMargin >= 0.20, "Top",
IF(vSales > 20000, "Médio", "Baixo")
)
Exemplo concreto: se um produto teve €150.000 em vendas nos últimos 12 meses e margem de 22%, recebe "Top". Se tiver €30.000 de vendas com margem 10%, recebe "Médio".
Passo 6: Evitar erros comuns (divisão por zero, relacionamentos, desempenho)
Pontos a vigiar:
- Relacionamentos: se Products e Sales não estiverem relacionados por ProductID, vSales será BLANK(). Verifique a direccionalidade e cardinalidade.
- Divisão por zero: use DIVIDE com terceiro argumento (ex.: 0 ou BLANK()).
- Desempenho: colunas calculadas em modelos grandes (por exemplo, 100k+ produtos) podem demorar. Considere calcular offline ou usar uma tabela agregada. Medidas são geralmente mais eficientes para cálculos dinamicamente filtrados.
- Contexto temporal: uma coluna calculada estática avalia no momento da criação; se quiser que a categoria mude com o slicer de datas, utilize uma medida ou uma tabela calculada com actualizações agendadas.
// Exemplo seguro de margem
Margin Avg =
DIVIDE(
SUM(Sales[MarginAmount]),
SUM(Sales[Amount]),
0
)
Verificar o resultado
Coloque Products[Product Category] numa tabela visual juntamente com Vendas L12M e Margin Avg. Valide com amostras: filtre o ano anterior e confirme que um conjunto de 10 produtos com maiores vendas realmente aparece como "Top". Se notar muitos "Baixo", reveja os thresholds ou utilize percentis (p.ex. TOP 10% > median). Se algumas linhas estiverem em branco, verifique relacionamentos e valores nulos em Sales.
Conclusão
Criar uma coluna de categoria dinâmica em DAX permite segmentar relatórios e facilitar análises no Power BI. Use thresholds claros, teste com conjuntos de dados representativos (p.ex. 1.000 produtos, 100k transacções) e escolha entre coluna calculada e medida conforme a necessidade de interactividade temporal. Próximos passos: transformar thresholds em parâmetros "what-if" para torná-los interactivos, ou gerar uma tabela agregada se o desempenho for crítico.