Conheça a linguagem DAX e sua função no Power BI

linguagem DAX
Pedro Tebaldi Autor: Pedro Tebaldi PM do KeepGreen
Publicado jan/2022Atualizado set/2026

DAX, sigla de Data Analysis Expressions, é a linguagem de fórmulas dos modelos tabulares da Microsoft. Com ela você escreve medidas, colunas calculadas e tabelas calculadas sobre colunas inteiras, ou seja, nunca sobre células soltas como no Excel.

Vale um esclarecimento antes de tudo: o DAX não é exclusivo do Power BI. A documentação da Microsoft descreve a linguagem como usada no Analysis Services, no Power BI e no Power Pivot do Excel.

Nas próximas seções você vai ver o que muda entre contexto de linha e contexto de filtro. Em seguida, CALCULATE, FILTER, ALL e RELATED aparecem com o resultado que cada uma devolve. Todos os números deste artigo saíram de um modelo de 1 milhão de linhas, isto é, nada aqui é hipotético.

 

O que é a linguagem DAX

A linguagem DAX é o conjunto de funções, operadores e valores que produz cálculos em modelos de dados tabulares. O motor avalia cada fórmula sobre tabelas e colunas relacionadas, jamais sobre uma célula isolada. É essa diferença, principalmente, que confunde quem chega do Excel e espera arrastar a fórmula linha a linha.

Toda fórmula DAX vive em três lugares dentro do modelo: medida, coluna calculada e tabela calculada. A escolha entre eles decide quando o cálculo acontece e, consequentemente, quanta memória o modelo consome.

 

Objeto DAX Quando o motor calcula Onde o resultado fica Responde ao filtro
Medida a cada célula do visual em memória, só durante a consulta Sim
Coluna calculada na atualização do modelo gravada linha a linha, ocupa memória Não
Tabela calculada na atualização do modelo gravada no modelo, consultável como qualquer tabela Não

 

Existe ainda um quarto uso: as regras de segurança em nível de linha também usam DAX. Segundo a mesma documentação, esse recurso não chega ao Power Pivot do Excel. Ou seja, os três produtos compartilham a linguagem sem serem idênticos por baixo.

 

O laboratório que gerou os números deste artigo

Todos os resultados abaixo saíram do Power BI Desktop 2.155.756.0, executado em 1 de setembro de 2026. O modelo tem três tabelas: Vendas com 1.000.000 de linhas, Produto com 8 linhas e Calendario com 1.096 dias. O calendário vai de 1 de janeiro de 2024 a 31 de dezembro de 2026.

Cada venda é sintética e determinística: um gerador com semente fixa distribui os oito produtos por quatro regiões. A tabela Vendas se relaciona com Produto por ProdutoID e com Calendario por Data. Portanto, nenhum número deste artigo foi digitado à mão.

 

Contexto de linha e contexto de filtro

Contexto de linha é a linha atual que a fórmula enxerga. Contexto de filtro, por outro lado, é o conjunto de valores que sobra depois de todos os filtros: os do visual, os da segmentação e os escritos dentro da própria fórmula. Uma medida sem contexto não tem resultado, porque o motor precisa saber sobre quais linhas calcular.

O erro mais caro de quem começa em DAX é somar duas colunas separadas para depois multiplicar os totais. Parece equivalente a multiplicar linha a linha. No entanto, não é.




medidas.dax
// certo: multiplica dentro de cada linha e soma depois
Faturamento =
    SUMX ( Vendas, Vendas[Quantidade] * Vendas[PrecoUnitario] )

// errado: colapsa cada coluna e multiplica os dois totais
Faturamento errado =
    SUM ( Vendas[Quantidade] ) * SUM ( Vendas[PrecoUnitario] )

No mesmo contexto, sem nenhum filtro aplicado, as duas medidas devolveram isto sobre o milhão de linhas:




resultado.txt
Linhas em Vendas                          1.000.000
SUM ( Quantidade )                        6.463.745
SUM ( PrecoUnitario )            13.576.597.727,42

Faturamento errado       87.755.665.677.622.300,00
Faturamento com SUMX             87.875.539.446,88

razao errado / certo                     998.635,87

O desvio não é arredondamento. O valor errado ficou 998.635,87 vezes maior que o certo, porque SUM colapsa a coluna antes da multiplicação. Em contrapartida, o SUMX percorre linha por linha, multiplica dentro de cada uma e só então soma o conjunto.

Por categoria de produto, direto no visual de tabela do Power BI, a distorção se mantém em cada linha:

 
Tabela do Power BI com as colunas Categoria, Faturamento, Faturamento errado e % do total, mostrando 87.875.539.446,88 no SUMX linha a linha contra 87.755.665.677.622.300,00 no produto de dois SUM

 

Repare que a coluna errada continua plausível dentro de cada categoria, apenas com muitos dígitos a mais. É por isso que o defeito passa despercebido: ele não gera erro nem célula em branco, apenas um número maior. Assim, nada no relatório sinaliza o problema.

 

CALCULATE: a função que reescreve o contexto de filtro

CALCULATE avalia uma expressão num contexto de filtro modificado. A regra que pega todo mundo está na documentação da Microsoft: quando a coluna já está no contexto, o novo filtro substitui o antigo. Ou seja, ele não se soma ao que já valia.

Compare as duas formas de filtrar lado a lado. Na consulta abaixo, a terceira coluna usa um predicado simples e a quarta usa FILTER sobre a tabela Vendas.




contexto-de-filtro.dax
EVALUATE
SUMMARIZECOLUMNS (
    Vendas[Regiao],
    "Faturamento", [Faturamento],
    "Com predicado", CALCULATE ( [Faturamento], Vendas[Regiao] = "Sul" ),
    "Com FILTER",    CALCULATE ( [Faturamento], FILTER ( Vendas, Vendas[Regiao] = "Sul" ) )
)
ORDER BY Vendas[Regiao]

No modo de exibição de consulta DAX do Power BI Desktop, o resultado voltou em 12,2 ms, com quatro colunas e quatro linhas:

 
Resultado de consulta DAX no Power BI Desktop com quatro regiões, em que CALCULATE com predicado devolve o faturamento do Sul em todas as linhas e CALCULATE com FILTER devolve valor em branco fora do Sul

 

Em texto, para quem quiser conferir número a número:




resultado.txt
Regiao            Faturamento    Com predicado       Com FILTER
Centro-Oeste    21.543.733.164,27    23.121.394.093,59    (em branco)
Nordeste        21.396.335.983,28    23.121.394.093,59    (em branco)
Sudeste         21.814.076.205,74    23.121.394.093,59    (em branco)
Sul             23.121.394.093,59    23.121.394.093,59 23.121.394.093,59

Olhe, por exemplo, as três primeiras linhas da coluna do meio. O contexto dizia Centro-Oeste, Nordeste ou Sudeste. Ainda assim, a medida devolveu o total do Sul em todas elas: 23.121.394.093,59. O predicado Vendas[Regiao] = "Sul" apagou o filtro de região que já estava valendo.

 

FILTER: quando o predicado simples não serve

Por outro lado, a função FILTER recebe uma tabela e devolve as linhas que passam na condição. Diferente do predicado solto, ela respeita o contexto de filtro que já está valendo e cruza com ele em vez de substituí-lo.

Daí que a última coluna volte em branco fora do Sul. O contexto do visual já tinha restringido Vendas àquela região, então nenhuma linha do Sul sobrou para o FILTER percorrer. No Sul, onde as duas condições coincidem, o valor aparece.

Existe um meio-termo que quebra a intuição. A variante FILTER ( ALL ( Vendas[Regiao] ), Vendas[Regiao] = "Sul" ) devolve 23.121.394.093,59 nas quatro regiões, igual ao predicado. O ALL remove o filtro antes de o FILTER começar a trabalhar.

Em síntese, o critério de decisão é curto. Use predicado quando quiser trocar o filtro de uma coluna. Já o FILTER sobre a tabela serve para restringir dentro do que o usuário selecionou. Para somar sem apagar, por fim, existe o modificador KEEPFILTERS.

 

ALL: o denominador que ignora o filtro

ALL remove filtros de uma coluna ou de uma tabela inteira. É com ele que se monta o denominador de um percentual: o numerador respeita o filtro do visual. O denominador, por outro lado, ignora tudo e devolve o total geral.




percentual.dax
Faturamento total geral =
    CALCULATE ( [Faturamento], ALL ( Vendas ) )

% do total =
    DIVIDE ( [Faturamento], [Faturamento total geral] )

Aplicado por categoria de produto, o resultado sai assim:




resultado.txt
Categoria         Faturamento      Total geral    % do total
Servidores  64.883.201.824,44  87.875.539.446,88       73,84%
Rede        21.257.595.933,61  87.875.539.446,88       24,19%
Licencas     1.734.741.688,83  87.875.539.446,88        1,97%

O denominador repete 87.875.539.446,88 nas três linhas, ou seja, ele ignora a categoria. É justamente isso que se quer. Sem o ALL, numerador e denominador seriam iguais em cada linha, logo o percentual daria 100% em todas as categorias.

 

RELATED busca um valor na tabela do lado “um” da relação, usando a linha atual do lado “muitos”. Ele só funciona onde existe contexto de linha, ou seja, numa coluna calculada ou dentro de um iterador como SUMX.




colunas-calculadas.dax
// duas colunas calculadas na tabela Vendas
CategoriaRelated = RELATED ( Produto[Categoria] )

ValorLinha = Vendas[Quantidade] * Vendas[PrecoUnitario]

Depois disso, as cinco primeiras linhas da tabela de fatos ficam assim:




resultado.txt
VendaID  ProdutoID  CategoriaRelated  Quantidade  PrecoUnitario   ValorLinha
      1          3  Servidores                10      26.733,30   267.333,00
      2          2  Servidores                 6      33.522,87   201.137,22
      3          5  Rede                       3      14.272,23    42.816,69
      4          4  Rede                       4       9.845,68    39.382,72
      5          7  Licencas                   7         915,67     6.409,69

Nenhuma das duas fórmulas menciona a relação. O contexto de linha atravessa o vínculo entre Vendas e Produto sozinho, porque o motor segue a relação ativa do modelo. Por outro lado, cada coluna dessas ocupa memória: com 1 milhão de linhas, o custo é real e permanente.

 

Onde medir o custo de uma medida DAX

O Performance Analyzer do Power BI Desktop separa o tempo de cada visual em três partes: consulta DAX, exibição do visual e outro. É o caminho, portanto, para descobrir se a lentidão vem da fórmula ou da renderização.

Na gravação de 1 de setembro de 2026, a tabela deste artigo levou 29 ms no total, assim divididos:

 
Painel Performance Analyzer do Power BI Desktop com a gravação iniciada em 01/09/2026, mostrando a tabela em 29 ms divididos em Consulta DAX 4 ms, Exibição de visual 7 ms e Outro 18 ms

 

Quatro milissegundos para agregar 1 milhão de linhas mostram o que o motor colunar faz com dados comprimidos. O número sozinho, contudo, importa menos que a divisão entre as três partes.

Use a proporção como critério. Quando “Consulta DAX” domina o total, mexa na medida. Quando “Exibição de visual” domina, reduza a quantidade de linhas ou de colunas que o visual pede.

Além disso, trocar a fórmula sem olhar essa divisão costuma consumir tempo sem mudar nada. Para o caminho completo de ajuste, veja o guia de otimização de performance no Power BI.

BI & Analytics

Transformamos dados brutos em decisões estratégicas e insights.

Construímos dashboards interativos, KPIs e relatórios automatizados integrados às suas fontes de dados existentes.

Fale com um Especialista →

 

Conclusão

Em resumo, o DAX roda no Power BI, no Power Pivot do Excel e no Analysis Services. A parte difícil não são as funções: é o contexto. SUMX contra SUM decide se o número está certo; CALCULATE decide qual filtro vale; FILTER decide se você cruza ou substitui.

Quem estuda DAX por lista de funções aprende a sintaxe e continua errando o total. O caminho mais curto é outro: monte um modelo pequeno, escreva a medida dos dois jeitos e compare o resultado. Dessa forma, o erro aparece antes de o relatório chegar à diretoria.

Para levar isso a produção, com modelo, dashboards e integração às fontes que a operação já usa, fale com os especialistas da OpServices.


 

Perguntas Frequentes

O DAX é exclusivo do Power BI?
Não. Segundo a documentação da Microsoft, o DAX é a linguagem de fórmulas usada no Analysis Services, no Power BI e no Power Pivot do Excel. Os três compartilham o mesmo motor tabular, então uma medida escrita em um deles costuma funcionar nos outros. A exceção conhecida é a segurança em nível de linha, que não está disponível no Power Pivot do Excel.
Qual a diferença entre medida e coluna calculada em DAX?
A medida roda no momento da consulta, muda conforme o filtro do relatório e não ocupa espaço gravado no modelo. A coluna calculada roda na atualização, fica gravada linha a linha na memória e não responde a filtro. Use medida para qualquer número que precise reagir à segmentação. Prefira coluna calculada quando precisar de um valor fixo por linha, como uma categoria que serve para agrupar ou filtrar.
Por que a minha medida DAX dá um total diferente da soma das linhas?
Porque o motor reavalia a medida em cada célula, inclusive na linha de total. Ela não soma o que apareceu acima dela. Uma fórmula como SUM(Vendas[Quantidade]) multiplicado por SUM(Vendas[PrecoUnitario]) devolve valores plausíveis por categoria e um total absurdo. No laboratório deste artigo a diferença chegou a 998.635,87 vezes. A correção é iterar linha a linha com SUMX em vez de multiplicar dois totais.
DAX é a mesma coisa que a linguagem M do Power Query?
Não. O M roda no Power Query, antes da carga: ele transforma os dados que entram no modelo, junta fontes, limpa colunas e converte tipo. O DAX roda depois, sobre o modelo já carregado. Ele calcula valores que respondem ao filtro do relatório. Regra prática: o que dá para resolver antes da carga fica no M, o que depende da seleção do usuário fica em DAX.
Acompanhe a OpServices10.576 profissionais de TI já seguemSeguir

Estou na OpServices desde 2011, onde sou Gerente de Marketing e Product Manager do KeepGreen, plataforma de gestão de incidentes de TI que higieniza alertas, aponta causa raiz com IA, escreve o post-mortem e analisa custos de nuvem. Também lidero os projetos de governança de inteligência artificial da empresa. Escrevo neste blog desde 2013, com mais de 550 artigos publicados sobre monitoramento, observabilidade, SRE e ITSM. LinkedIn

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *