(+351) 21 24 10006  ·  info@bconcepts.pt
Carnaxide, Lisboa

Como criar uma coluna de categoria dinâmica em DAX: passo a passo

João Barros 14 de October de 2026 5 min de leitura

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.