Fórmulas DAX que todo usuário empresarial deve saber

Domine 20 fórmulas DAX essenciais para Power BI. CALCULAR, inteligência de tempo, RANKX, transição de contexto, iteradores e exemplos práticos de negócios.

E
ECOSIRE Research and Development Team
|17 de março de 202616 min de leitura3.7k Palavras|

Parte da nossa série Data Analytics & BI

Leia o guia completo

Fórmulas DAX que todo usuário empresarial deve saber

DAX (Data Analysis Expressions) é a linguagem de fórmula que transforma o Power BI de uma simples ferramenta de gráficos em um mecanismo analítico completo. Embora a interface de arrastar e soltar do Power BI lide com agregações básicas, a verdadeira inteligência de negócios requer DAX. Comparações ano após ano, médias móveis, classificações, cenários hipotéticos e KPIs complexos dependem de fórmulas DAX.

O desafio é que o DAX parece aparentemente simples, mas se comporta de maneira que surpreende até mesmo usuários experientes do Excel. Os conceitos de contexto de filtro, contexto de linha e transição de contexto são exclusivos do DAX e não têm equivalente direto no Excel ou SQL. Este guia concentra-se nas 20 fórmulas DAX mais práticas para usuários empresariais, com exemplos do mundo real que você pode adaptar imediatamente.


Principais conclusões

  • CALCULATE é a função DAX mais importante --- ela modifica o contexto do filtro e é usada em mais de 80% das medidas não triviais
  • As funções de inteligência temporal (TOTALYTD, SAMEPERIODLASTYEAR, DATEADD) requerem uma tabela de datas adequada marcada como tal no modelo
  • A sintaxe VAR/RETURN torna medidas complexas legíveis e evita cálculos redundantes
  • Funções iteradoras (SUMX, AVERAGEX, RANKX) avaliam expressões linha por linha, enquanto agregadores (SUM, AVERAGE) operam em colunas
  • A transição de contexto ocorre quando uma coluna calculada ou iterador chama uma medida, convertendo o contexto da linha em contexto de filtro
  • SWITCH(TRUE(), ...) substitui instruções IF aninhadas e é muito mais legível
  • ALL, ALLEXCEPT e REMOVEFILTERS controlam quais filtros estão ativos --- mas tenha cuidado com as implicações de RLS

Fundação: Contexto de Filtro e Contexto de Linha

Antes de mergulhar nas fórmulas, é essencial compreender esses dois conceitos. Toda confusão no DAX remonta ao contexto do filtro e ao contexto da linha.

Filtro de contexto

Contexto de filtro é o conjunto de filtros aplicados a um cálculo. Ele vem de segmentações de dados, filtros visuais, filtros de página, filtros de relatório e RLS. Quando você coloca uma medida em um visual de matriz com "Ano" nas linhas e "Região" nas colunas, cada célula tem um contexto de filtro exclusivo: (Ano = 2025, Região = América do Norte), (Ano = 2025, Região = EMEA) e assim por diante.

Cada função de agregação DAX (SUM, AVERAGE, COUNT, MIN, MAX) é avaliada dentro do contexto de filtro atual. SUM(Sales[Revenue]) em uma célula filtrada para 2025 + América do Norte soma apenas as linhas de receita que correspondem a ambas as condições.

Contexto da linha

O contexto da linha existe dentro de colunas calculadas e funções iteradoras. Significa "a linha atual". Em uma coluna calculada na tabela Vendas, Sales[Revenue] * Sales[Quantity] avalia cada linha individualmente.

Transição de Contexto

Quando uma função iteradora (como SUMX) chama uma medida, o contexto da linha é automaticamente convertido em contexto de filtro. Isso é chamado de transição de contexto. É poderoso, mas pode ser uma fonte de problemas de desempenho se for mal utilizado.

-- Row context exists here (iterating over Products)
Revenue Per Product =
SUMX(
    Products,
    [Total Revenue]  -- This measure is evaluated in filter context
                     -- where the current product's ID filters the Sales table
)

A compreensão desses conceitos torna cada fórmula DAX intuitiva. Sem eles, as fórmulas DAX parecem caixas pretas.


As 20 Fórmulas Essenciais

1. CALCULAR — Modificar o contexto do filtro

CALCULATE é a função DAX mais importante. Avalia uma expressão em um contexto de filtro modificado.

Sintaxe: CALCULATE(expression, filter1, filter2, ...)

Exemplo: receita apenas de pedidos grandes

Large Order Revenue =
CALCULATE(
    SUM(Sales[Revenue]),
    Sales[OrderTotal] > 10000
)

Exemplo: receita de uma categoria de produto específica

Electronics Revenue =
CALCULATE(
    SUM(Sales[Revenue]),
    Products[Category] = "Electronics"
)

CALCULATE substitui o filtro existente na coluna especificada. Se uma segmentação de dados já filtrar Categoria como "Vestuário", a medida Receita de eletrônicos ignorará essa segmentação e mostrará Receita de eletrônicos porque CALCULATE substitui o filtro de categoria.

2. FILTER — Filtragem em nível de linha

FILTER retorna uma tabela filtrada por uma condição. É frequentemente usado dentro de CALCULATE para filtragem complexa que não pode ser expressa como uma simples comparação de colunas.

Sintaxe: FILTER(table, condition)

Exemplo: Receita de clientes com mais de 5 pedidos

Revenue From Repeat Customers =
CALCULATE(
    SUM(Sales[Revenue]),
    FILTER(
        Customers,
        CALCULATE(COUNTROWS(Sales)) > 5
    )
)

Importante: FILTER itera linha por linha, tornando-o mais lento que filtros simples CALCULATE em tabelas grandes. Use-o somente quando um filtro de coluna direto for insuficiente.

3. TODOS - Remover todos os filtros

ALL remove todos os filtros de uma tabela ou coluna, retornando a tabela completa não filtrada. É usado para calcular totais, porcentagens do total e proporções.

Sintaxe: ALL(table) ou ALL(table[column])

Exemplo: receita como porcentagem do total

Revenue % of Total =
DIVIDE(
    SUM(Sales[Revenue]),
    CALCULATE(SUM(Sales[Revenue]), ALL(Sales))
)

Quando uma segmentação de dados é filtrada para "América do Norte", SUM(Sales[Revenue]) retorna a receita da América do Norte. CALCULATE(SUM(Sales[Revenue]), ALL(Sales)) remove todos os filtros e retorna a receita global. A divisão dá a porcentagem.

4. ALLEXCEPT – Remover todos os filtros, exceto os especificados

ALLEXCEPT remove todos os filtros de uma tabela, exceto as colunas especificadas. Isto é útil quando você deseja preservar alguns filtros (como ano) enquanto remove outros (como categoria de produto).

Sintaxe: ALLEXCEPT(table, column1, column2, ...)

Exemplo: divisão da receita no ano atual

Revenue % of Year Total =
DIVIDE(
    SUM(Sales[Revenue]),
    CALCULATE(
        SUM(Sales[Revenue]),
        ALLEXCEPT(Sales, DateTable[Year])
    )
)

Isso mostra a participação de cada produto ou região na receita no ano selecionado, e não em todo o período.

5. TOTALYTD — Acumulado no ano

TOTALYTD calcula um total acumulado desde o início do ano até a data atual no contexto.

Sintaxe: TOTALYTD(expression, dates[date_column], [filter], [year_end_date])

Exemplo: receita acumulada no ano

Revenue YTD =
TOTALYTD(SUM(Sales[Revenue]), DateTable[Date])

Com ano fiscal encerrado em 30 de junho:

Revenue Fiscal YTD =
TOTALYTD(SUM(Sales[Revenue]), DateTable[Date], "6/30")

Pré-requisito: A DateTable deve ser marcada como uma tabela de datas no modelo (Ferramentas de Tabela, depois Marcar como Tabela de Datas).

6. MESMO PERIODLASTYEAR - ano após ano

SAMEPERIODLASTYEAR desloca o contexto da data exatamente um ano.

Sintaxe: SAMEPERIODLASTYEAR(dates[date_column])

Exemplo: receita em relação ao ano passado

Revenue PY =
CALCULATE(SUM(Sales[Revenue]), SAMEPERIODLASTYEAR(DateTable[Date]))

Revenue YoY Growth =
VAR CurrentRevenue = SUM(Sales[Revenue])
VAR PriorRevenue = [Revenue PY]
RETURN
DIVIDE(CurrentRevenue - PriorRevenue, PriorRevenue, 0)

Numa matriz mensal, cada linha mostra a receita do mês atual e do mesmo mês do ano anterior, juntamente com a percentagem de crescimento.

7. DATEADD — Mudanças de horário flexíveis

DATEADD muda as datas em qualquer intervalo: dias, meses, trimestres ou anos. É mais flexível que SAMEPERIODLASTYEAR.

Sintaxe: DATEADD(dates[date_column], intervals, interval_type)

Exemplo: receita de 3 meses atrás

Revenue 3 Months Ago =
CALCULATE(
    SUM(Sales[Revenue]),
    DATEADD(DateTable[Date], -3, MONTH)
)

Exemplo: receita contínua de 12 meses

Revenue Rolling 12M =
CALCULATE(
    SUM(Sales[Revenue]),
    DATESINPERIOD(DateTable[Date], MAX(DateTable[Date]), -12, MONTH)
)

8. RANKX — Classificações Dinâmicas

RANKX atribui uma classificação a cada item com base em uma expressão.

Sintaxe: RANKX(table, expression, [value], [order], [ties])

Exemplo: Classifique os produtos por receita

Product Revenue Rank =
RANKX(
    ALL(Products[ProductName]),
    [Total Revenue],
    ,
    DESC,
    DENSE
)

O ALL(Products[ProductName]) fornece a lista completa de produtos para classificação, independentemente dos filtros de segmentação de dados nos produtos. DESC significa que a receita mais alta obtém a classificação 1. DENSE significa que os valores vinculados obtêm a mesma classificação.

Exemplo: filtro N superior

Top 10 Products Revenue =
CALCULATE(
    [Total Revenue],
    FILTER(
        ALL(Products[ProductName]),
        RANKX(ALL(Products[ProductName]), [Total Revenue], , DESC) <= 10
    )
)

9. SWITCH - Lógica Condicional

SWITCH substitui instruções IF aninhadas e é muito mais legível.

Sintaxe: SWITCH(expression, value1, result1, value2, result2, ..., else_result)

Exemplo: Classificação do segmento de cliente

Customer Segment =
SWITCH(
    TRUE(),
    [Total Revenue] > 100000, "Enterprise",
    [Total Revenue] > 25000, "Mid-Market",
    [Total Revenue] > 5000, "SMB",
    "Startup"
)

Exemplo: seleção de medida dinâmica

Selected Measure =
SWITCH(
    SELECTEDVALUE(MeasureSelector[Measure]),
    "Revenue", [Total Revenue],
    "Orders", [Order Count],
    "AOV", [Average Order Value],
    "Margin", [Gross Margin %],
    [Total Revenue]
)

Esse padrão funciona com uma segmentação de dados que permite aos usuários escolher qual métrica exibir em um gráfico.

10. VAR/RETURN — Variáveis

As variáveis ​​armazenam resultados intermediários, tornando as fórmulas legíveis e evitando cálculos redundantes. Uma variável é avaliada uma vez e reutilizada.

Sintaxe: VAR name = expression RETURN final_expression

Exemplo: KPI complexo com variáveis

Customer Health Score =
VAR Revenue = [Total Revenue]
VAR OrderCount = [Order Count]
VAR DaysSinceLastOrder =
    DATEDIFF(MAX(Sales[OrderDate]), TODAY(), DAY)
VAR RevenueScore =
    SWITCH(TRUE(), Revenue > 50000, 3, Revenue > 10000, 2, 1)
VAR FrequencyScore =
    SWITCH(TRUE(), OrderCount > 20, 3, OrderCount > 5, 2, 1)
VAR RecencyScore =
    SWITCH(TRUE(), DaysSinceLastOrder < 30, 3, DaysSinceLastOrder < 90, 2, 1)
RETURN
    RevenueScore + FrequencyScore + RecencyScore

Sem variáveis, esta fórmula repetiria os mesmos cálculos várias vezes, tornando-a ilegível e mais lenta.

11. DIVIDIR – Divisão Segura

DIVIDE lida com a divisão por zero normalmente, retornando um resultado alternativo especificado em vez de um erro.

Sintaxe: DIVIDE(numerator, denominator, [alternate_result])

Exemplo:

Conversion Rate =
DIVIDE([Closed Won Deals], [Total Opportunities], 0)

Sempre use DIVIDE em vez do operador / nas medidas. O operador / retorna um erro ao dividir por zero, quebrando seu visual.

12. DISTINCTCOUNT – Contar valores exclusivos

DISTINCTCOUNT conta o número de valores exclusivos em uma coluna.

Sintaxe: DISTINCTCOUNT(column)

Exemplo: Clientes ativos no período

Active Customers =
DISTINCTCOUNT(Sales[CustomerID])

Isso conta clientes únicos que fizeram pelo menos uma compra no contexto de filtro atual (mês, trimestre selecionado, etc.).

13. COUNTROWS — Contar linhas em uma tabela

COUNTROWS conta o número de linhas em uma tabela, opcionalmente filtradas.

Sintaxe: COUNTROWS(table)

Exemplo: contagem de pedidos

Order Count =
COUNTROWS(Sales)

Cancelled Orders =
CALCULATE(
    COUNTROWS(Sales),
    Sales[Status] = "Cancelled"
)

14. SUMX - Soma linha por linha

SUMX é um iterador que avalia uma expressão para cada linha e soma os resultados. É essencial quando você precisa multiplicar colunas antes de somar.

Sintaxe: SUMX(table, expression)

Exemplo: Cálculo da média ponderada

Weighted Average Price =
DIVIDE(
    SUMX(Sales, Sales[Quantity] * Sales[UnitPrice]),
    SUM(Sales[Quantity])
)

SUM não pode multiplicar duas colunas. Você precisa do SUMX para avaliar Quantidade vezes UnitPrice para cada linha e, em seguida, somar os resultados.

15. AVERAGEX — Média linha por linha

AVERAGEX é a versão iteradora de AVERAGE.

Sintaxe: AVERAGEX(table, expression)

Exemplo: média de dias para fechamento

Average Days to Close =
AVERAGEX(
    Opportunities,
    DATEDIFF(Opportunities[CreatedDate], Opportunities[ClosedDate], DAY)
)

16. MAXX e MINX - Iterador Mín/Máx

MAXX e MINX encontram o valor máximo ou mínimo de uma expressão avaliada linha por linha.

Exemplo: data do último pedido por cliente

Most Recent Order =
MAXX(Sales, Sales[OrderDate])

Oldest Unpaid Invoice =
MINX(
    FILTER(Invoices, Invoices[PaymentStatus] = "Unpaid"),
    Invoices[InvoiceDate]
)

17. LOOKUPVALUE - Equivalente a VLOOKUP

LOOKUPVALUE recupera um valor de uma tabela com base em um ou mais critérios de pesquisa. É o equivalente DAX do VLOOKUP do Excel.

Sintaxe: LOOKUPVALUE(result_column, search_column, search_value, ...)

Exemplo:

Customer Region =
LOOKUPVALUE(
    Customers[Region],
    Customers[CustomerID], Sales[CustomerID]
)

Observação: LOOKUPVALUE normalmente é usado em colunas calculadas, não em medidas. Nas medidas, são preferidos RELATED (para muitos para um) ou RELATEDTABLE (para um para muitos).

18. SELECTEDVALUE — Obtenha o valor atual do Slicer

SELECTEDVALUE retorna o valor de uma coluna quando exatamente um valor está no contexto do filtro. Se vários valores forem selecionados, ele retornará o resultado alternativo.

Sintaxe: SELECTEDVALUE(column, [alternate_result])

Exemplo: título dinâmico

Chart Title =
"Revenue for " & SELECTEDVALUE(DateTable[Year], "All Years")

19. ISBLANK – Verifique se há valores vazios

ISBLANK testa se um valor está em branco (nulo/vazio).

Exemplo: Pedidos sem vendedor designado

Unassigned Orders =
CALCULATE(
    COUNTROWS(Sales),
    ISBLANK(Sales[SalespersonID])
)

20. CONCATENATEX — Concatenar valores de uma tabela

CONCATENATEX itera em uma tabela e concatena valores em uma única string.

Sintaxe: CONCATENATEX(table, expression, [delimiter], [order_by], [order])

Exemplo: Lista de produtos adquiridos por um cliente

Products Purchased =
CONCATENATEX(
    VALUES(Products[ProductName]),
    Products[ProductName],
    ", ",
    Products[ProductName], ASC
)

Em uma tabela de detalhes do cliente, isso mostra “Produto A, Produto B, Produto C” para cada cliente.


Aprofundamento da Inteligência de Tempo

A inteligência de tempo é o motivo mais comum pelo qual os usuários empresariais precisam do DAX. As funções de inteligência temporal do Power BI exigem uma tabela de datas dedicada. Aqui está um conjunto abrangente de medidas de tempo.

Pré-requisitos: a tabela de datas

Seu modelo deve ter uma tabela de datas com:

  • Uma coluna de data contínua (sem lacunas) cobrindo todo o intervalo de dados
  • A tabela marcada como tabela de datas (Ferramentas de Tabela e Marcar como Tabela de Datas)
  • Um relacionamento da coluna de data da tabela de datas com a coluna de data de cada tabela de fatos

Medidas comuns de inteligência de tempo

-- Month-to-Date
Revenue MTD =
TOTALMTD(SUM(Sales[Revenue]), DateTable[Date])

-- Quarter-to-Date
Revenue QTD =
TOTALQTD(SUM(Sales[Revenue]), DateTable[Date])

-- Year-to-Date
Revenue YTD =
TOTALYTD(SUM(Sales[Revenue]), DateTable[Date])

-- Previous Month
Revenue PM =
CALCULATE(SUM(Sales[Revenue]), PREVIOUSMONTH(DateTable[Date]))

-- Previous Quarter
Revenue PQ =
CALCULATE(SUM(Sales[Revenue]), PREVIOUSQUARTER(DateTable[Date]))

-- Previous Year
Revenue PY =
CALCULATE(SUM(Sales[Revenue]), PREVIOUSYEAR(DateTable[Date]))

-- Month-over-Month Growth
Revenue MoM % =
VAR Current = SUM(Sales[Revenue])
VAR Prior = [Revenue PM]
RETURN DIVIDE(Current - Prior, Prior, 0)

-- Year-over-Year Growth
Revenue YoY % =
VAR Current = SUM(Sales[Revenue])
VAR Prior = [Revenue PY]
RETURN DIVIDE(Current - Prior, Prior, 0)

-- Rolling 3-Month Average
Revenue 3M Avg =
AVERAGEX(
    DATESINPERIOD(DateTable[Date], MAX(DateTable[Date]), -3, MONTH),
    CALCULATE(SUM(Sales[Revenue]))
)

-- Cumulative Total (Running Sum)
Revenue Cumulative =
CALCULATE(
    SUM(Sales[Revenue]),
    FILTER(
        ALL(DateTable[Date]),
        DateTable[Date] <= MAX(DateTable[Date])
    )
)

Inteligência temporal do ano fiscal

Se o seu ano fiscal não estiver alinhado com o ano civil, use o parâmetro opcional year_end_date:

-- Fiscal Year ending March 31
Revenue Fiscal YTD =
TOTALYTD(SUM(Sales[Revenue]), DateTable[Date], "3/31")

-- Or use DATESYTD for more control
Revenue Fiscal YTD v2 =
CALCULATE(
    SUM(Sales[Revenue]),
    DATESYTD(DateTable[Date], "3/31")
)

Transição de contexto: o mecanismo oculto

A transição de contexto é o processo em que o contexto da linha (de uma coluna calculada ou iterador) é convertido em contexto de filtro quando uma medida é chamada. Este é o conceito mais poderoso e mais incompreendido do DAX.

Como funciona

Considere esta medida:

Total Revenue = SUM(Sales[Revenue])

E esta coluna calculada na tabela Produtos:

Product Revenue = [Total Revenue]

Na coluna calculada, existe o contexto da linha (a linha do produto atual). Quando [Total Revenue] é chamado, a transição de contexto converte o contexto da linha em um filtro: CALCULATE(SUM(Sales[Revenue]), Products[ProductID] = <current row's ProductID>). O resultado é a receita desse produto específico.

Implicações de desempenho

A transição de contexto adiciona um CALCULATE implícito em torno da chamada de medida. Para mesas pequenas, isso é insignificante. Para mesas grandes e com medidas complexas, pode sair caro. Evite chamar medidas complexas dentro de iteradores em tabelas grandes.

Ineficiente:

-- Iterates over every customer, calling a complex measure each time
Customer Profitability =
SUMX(
    Customers,
    [Revenue] - [COGS] - [Allocated Overhead]
)

Melhor:

-- Pre-compute the components and use simple arithmetic
Customer Profitability =
SUM(Sales[Revenue]) - SUM(Sales[COGS]) -
DIVIDE(SUM(Sales[Revenue]), [Total Revenue]) * [Total Overhead]

Cenários práticos de negócios

Cenário 1: Análise ABC (Classificação de Pareto)

Classifique os produtos em A (80% principais da receita), B (próximos 15%) e C (5% inferiores):

ABC Class =
VAR CurrentProduct = SELECTEDVALUE(Products[ProductName])
VAR AllProducts =
    ADDCOLUMNS(
        ALL(Products[ProductName]),
        "@Revenue", [Total Revenue]
    )
VAR Sorted = TOPN(COUNTROWS(AllProducts), AllProducts, [@Revenue], DESC)
VAR TotalRev = SUMX(AllProducts, [@Revenue])
VAR CumulativeRev =
    SUMX(FILTER(Sorted, [@Revenue] >= [Total Revenue]), [@Revenue])
VAR CumulativePct = DIVIDE(CumulativeRev, TotalRev)
RETURN
    SWITCH(TRUE(),
        CumulativePct <= 0.8, "A",
        CumulativePct <= 0.95, "B",
        "C"
    )

Cenário 2: Análise de retenção de coorte

Acompanhe quantos clientes de cada coorte de aquisição permanecem ativos ao longo do tempo:

Cohort Retention Rate =
VAR CohortMonth = SELECTEDVALUE(DateTable[YearMonth])
VAR CohortCustomers =
    CALCULATE(
        DISTINCTCOUNT(Sales[CustomerID]),
        FILTER(
            ALL(Sales),
            FORMAT(Sales[FirstPurchaseDate], "YYYY-MM") = CohortMonth
        )
    )
VAR ActiveCustomers =
    CALCULATE(
        DISTINCTCOUNT(Sales[CustomerID]),
        FILTER(
            ALL(Sales),
            FORMAT(Sales[FirstPurchaseDate], "YYYY-MM") = CohortMonth
        )
    )
RETURN
    DIVIDE(ActiveCustomers, CohortCustomers, 0)

Cenário 3: Total Anual Móvel (MAT)

Um total anual móvel suaviza a sazonalidade somando os últimos 12 meses completos:

Revenue MAT =
CALCULATE(
    SUM(Sales[Revenue]),
    DATESINPERIOD(DateTable[Date], MAX(DateTable[Date]), -12, MONTH)
)

Revenue MAT Growth =
VAR Current = [Revenue MAT]
VAR Prior =
    CALCULATE(
        [Revenue MAT],
        DATEADD(DateTable[Date], -12, MONTH)
    )
RETURN
    DIVIDE(Current - Prior, Prior, 0)

Iterador vs Agregador: quando usar cada um

Funções agregadoras

SUM, AVERAGE, COUNT, MIN, MAX operam em uma única coluna. Eles são rápidos porque o mecanismo de armazenamento pode resolvê-los diretamente a partir de dados de coluna compactados.

Use quando: Você precisa de uma agregação simples de uma coluna.

Funções Iteradoras

SUMX, AVERAGEX, COUNTX, MINX, MAXX, RANKX avaliam uma expressão linha por linha. Eles são mais flexíveis, mas mais lentos porque o mecanismo de fórmula processa cada linha.

Usar quando:

  • Você precisa multiplicar as colunas antes de agregar (SUMX para cálculos ponderados)
  • Você precisa aplicar uma condição por linha (COUNTX com IF)
  • Você precisa classificar os itens (RANKX)
  • O cálculo depende de valores de tabelas relacionadas que precisam de avaliação em nível de linha

Regra básica de desempenho: Se o mesmo resultado puder ser alcançado com um agregador, use o agregador. Use iteradores somente quando a avaliação linha por linha for necessária.


Depurando DAX

Mensagens de erro comuns

ErroCausaCorreção
"É esperado um único valor para a coluna X"Measure retorna vários valores onde um é esperadoUse SELECTEDVALUE, MAX ou CALCULATE para reduzir para um valor
“Dependência circular”Duas colunas ou medidas calculadas fazem referência entre siRedesenhar a cadeia de cálculo para remover o ciclo
"Não é possível determinar relacionamentos"Caminho de relacionamento ambíguo entre tabelasEspecifique o relacionamento em USERELATIONSHIP ou ative-o
"A expressão refere-se a múltiplas colunas"ALL/VALUES usados ​​com múltiplas colunas incorretamenteUse ALL(Tabela) ou ALL(Tabela[Col1], Tabela[Col2])

Analisador de Desempenho

O Analisador de Desempenho do Power BI Desktop (Exibição e, em seguida, Analisador de Desempenho) mostra a consulta DAX e o tempo de execução de cada visual. Use-o para:

  1. Identifique imagens lentas (mais de 1 segundo)
  2. Copie a consulta DAX para o DAX Studio para análise detalhada
  3. Compare os tempos de execução antes/depois ao otimizar medidas

Estúdio DAX

DAX Studio é uma ferramenta externa gratuita que fornece análise detalhada de consultas. Isso mostra:

  • Consultas do mecanismo de armazenamento (varreduras rápidas de armazenamento de colunas)
  • Consultas do mecanismo de fórmula (avaliação mais lenta, linha por linha)
  • Tamanhos de materialização (dados embaralhados entre motores)

Se uma medida gerar muitas consultas de mecanismo de fórmula, provavelmente usará muitos iteradores ou expressões FILTER complexas. Refatore para enviar mais trabalho ao mecanismo de armazenamento.

Para treinamento em Power BI que abrange DAX desde os fundamentos até a otimização avançada, a ECOSIRE oferece workshops práticos adaptados aos seus conjuntos de dados e questões de negócios específicos.


Perguntas frequentes

Qual é a diferença entre uma medida e uma coluna calculada?

Uma medida é avaliada no momento da consulta no contexto de filtro atual. Ele não adiciona dados à tabela – ele calcula um valor dinamicamente. Uma coluna calculada é avaliada no momento da atualização dos dados e adiciona uma coluna física à tabela. Use medidas para agregações e KPIs que mudam com base em segmentações de dados e filtros. Use colunas calculadas para classificações ou valores em nível de linha que precisam ser usados ​​em segmentações de dados, filtros ou relacionamentos. As medidas são quase sempre preferidas porque não aumentam o tamanho do modelo.

Por que minha medida acumulada no ano mostra valores incorretos?

A causa mais comum é que sua tabela de datas não está configurada corretamente. Verifique três coisas: (1) a tabela de datas não tem lacunas --- todas as datas desde o início dos seus dados até o presente devem ser incluídas, (2) a tabela está marcada como uma tabela de datas no Power BI (Ferramentas de Tabela, depois Marcar como Tabela de Datas) e (3) o relacionamento entre a tabela de datas e sua tabela de fatos está ativo e mapeado corretamente. Verifique também se a coluna de data não inclui um componente de hora que impeça a correspondência exata.

Quando devo usar CALCULATE versus FILTER?

Use CALCULATE quando puder expressar o filtro como uma simples comparação de colunas (por exemplo, Products[Category] = "Electronics"). CALCULATE converte isso em um filtro eficiente que o mecanismo de armazenamento pode otimizar. Use FILTER quando precisar de condições complexas linha por linha que façam referência a várias colunas ou medidas de chamada (por exemplo, filtrando clientes onde CALCULATE(COUNTROWS(Sales)) > 5). FILTER é um iterador e é mais lento, então prefira a sintaxe simples de CALCULATE quando possível.

Como faço para criar uma soma total acumulada ou cumulativa no DAX?

Use CALCULATE com um filtro que inclui todas as datas até a data atual: Revenue Cumulative = CALCULATE(SUM(Sales[Revenue]), FILTER(ALL(DateTable[Date]), DateTable[Date] <= MAX(DateTable[Date]))). Isso remove o filtro de data existente (ALL) e o substitui por um filtro que inclui todas as datas desde o início até a data máxima no contexto atual. Em uma matriz mensal, cada linha mostra o total acumulado naquele mês.

Posso usar o DAX para gravar dados no banco de dados?

Não. DAX é uma linguagem de consulta somente leitura. Ele pode calcular, filtrar e transformar dados para exibição, mas não pode inserir, atualizar ou excluir dados no banco de dados de origem. Para cenários de write-back, utilize o Power Apps incorporado no Power BI ou utilize fluxos do Power Automate acionados por alertas do Power BI. Algumas ferramentas de terceiros (Acterys, Writeback Manager) adicionam recursos de write-back por meio de recursos visuais personalizados.

E

Escrito por

ECOSIRE Research and Development Team

Construindo produtos digitais de nível empresarial na ECOSIRE. Compartilhando insights sobre integrações Odoo, automação de e-commerce e soluções de negócios com IA.

Converse no WhatsApp