Skip to content

Referência rápida DAX ​

Tipo
Referência
Para
Analista
Na tela
DataViz › Aplicação › Editar › Expressões
Liberação
Em beta

Fórmulas DAX por tarefa, com a forma SQL quando ela existe. A sintaxe das expressões em SQL está em Linguagem de expressões. Para aprender passo a passo, use o tutorial DAX.

Você vem deO que muda
Primeira linguagem de fórmulaMedida é um valor calculado para cada linha do gráfico.
ExcelSUM soma só as linhas que passam no filtro de cada linha do gráfico. Faz o papel do SOMASE.
SQLSem GROUP BY e sem JOIN. O gráfico agrupa e os relacionamentos do app ligam as tabelas.
Power BIMesmo DAX, só para medidas. Veja Diferenças em relação ao Power BI.

Somar e contar ​

Somar ​

dax
SUM('Vendas'[Faturamento])
sql
SUM([Vendas].[Faturamento])

Contar linhas ​

dax
COUNTROWS('Vendas')
sql
COUNT([Vendas].[Faturamento])

Contar distintos ​

dax
DISTINCTCOUNT('Clientes'[Cliente])
sql
COUNT(DISTINCT [Clientes].[Cliente])

Média ​

dax
AVERAGE('Vendas'[Faturamento])
sql
AVG([Vendas].[Faturamento])

Divisão com divisor zero ​

dax
DIVIDE(SUM('Vendas'[Faturamento]), COUNTROWS('Vendas'))
sql
SUM([Vendas].[Faturamento]) / NULLIF(COUNT([Vendas].[Faturamento]), 0)

Filtrar ​

Um valor ​

dax
CALCULATE(SUM('Vendas'[Faturamento]), 'Clientes'[UF] = "SP")
sql
SUM(CASE WHEN [Clientes].[UF] = 'SP' THEN [Vendas].[Faturamento] END)

Dois valores ​

dax
CALCULATE(SUM('Vendas'[Faturamento]), 'Clientes'[UF] IN {"SP", "PR"})
sql
SUM(CASE WHEN [Clientes].[UF] IN ('SP', 'PR') THEN [Vendas].[Faturamento] END)

Manter o filtro da linha ​

dax
CALCULATE(SUM('Vendas'[Faturamento]), KEEPFILTERS('Clientes'[UF] = "SP"))

Clientes acima de um valor ​

dax
COUNTROWS(FILTER(VALUES('Clientes'[Cliente]), CALCULATE(SUM('Vendas'[Faturamento])) > 1000))

Remover filtros ​

Percentual do total ​

dax
DIVIDE(SUM('Vendas'[Faturamento]), CALCULATE(SUM('Vendas'[Faturamento]), ALLSELECTED('Clientes'[UF])))
sql
SUM([Vendas].[Faturamento]) / NULLIF(SUM(SUM([Vendas].[Faturamento])) OVER (), 0)

Total sem filtros de Clientes ​

dax
CALCULATE(SUM('Vendas'[Faturamento]), ALL('Clientes'))

Total de todos os períodos ​

dax
CALCULATE(SUM('Vendas'[Faturamento]), REMOVEFILTERS('Calendário'))

Comparar períodos ​

Ano anterior ​

dax
CALCULATE(SUM('Vendas'[Faturamento]), SAMEPERIODLASTYEAR('Calendário'[Data]))
sql
${SUM([Vendas].[Faturamento]), [Calendário].[Data] BETWEEN SUBYEARS(<[Calendário].[Data]:START, CURRENT_DATE>, 1) AND SUBYEARS(<[Calendário].[Data]:END, CURRENT_DATE>, 1)}

Mês anterior ​

dax
CALCULATE(SUM('Vendas'[Faturamento]), PREVIOUSMONTH('Calendário'[Data]))

Acumulado no ano ​

dax
CALCULATE(SUM('Vendas'[Faturamento]), DATESYTD('Calendário'[Data]))

Acumulado do ano anterior ​

dax
CALCULATE(SUM('Vendas'[Faturamento]), SAMEPERIODLASTYEAR(DATESYTD('Calendário'[Data])))

Período deslocado ​

dax
CALCULATE(SUM('Vendas'[Faturamento]), DATEADD('Calendário'[Data], -3, MONTH))

Últimos 12 meses ​

dax
CALCULATE(SUM('Vendas'[Faturamento]), DATESINPERIOD('Calendário'[Data], MAX('Calendário'[Data]), -12, MONTH))

Variação percentual ​

dax
VAR atual = SUM('Vendas'[Faturamento])
VAR anterior = CALCULATE(SUM('Vendas'[Faturamento]), SAMEPERIODLASTYEAR('Calendário'[Data]))
RETURN DIVIDE(atual - anterior, anterior)

Ranking e acumulado ​

Posição ​

dax
RANKX(ALLSELECTED('Clientes'[Cliente]), SUM('Vendas'[Faturamento]))
sql
RANK() OVER (ORDER BY SUM([Vendas].[Faturamento]) DESC)

Posição dentro de cada UF ​

dax
RANK(SKIP, ALLSELECTED('Clientes'[UF], 'Clientes'[Cliente]), ORDERBY(SUM('Vendas'[Faturamento]), DESC), DEFAULT, PARTITIONBY('Clientes'[UF]))

Acumulado na ordem ​

dax
CALCULATE(SUM('Vendas'[Faturamento]), WINDOW(1, ABS, 0, REL, ORDERBY('Calendário'[Data])))
sql
SUM(SUM([Vendas].[Faturamento])) OVER (ORDER BY MIN([Calendário].[Data]))

Linha anterior ​

dax
CALCULATE(SUM('Vendas'[Faturamento]), OFFSET(-1, ORDERBY('Calendário'[Data])))
sql
LAG(SUM([Vendas].[Faturamento]), 1, NULL) OVER (ORDER BY MIN([Calendário].[Data]))

Último valor ​

Estoque no último dia ​

dax
CALCULATE(SUM('Estoque'[Qtd]), LASTDATE('Estoque'[Data]))

Último valor não vazio ​

dax
LASTNONBLANKVALUE('Estoque'[Data], SUM('Estoque'[Qtd]))

Condição ​

Condição simples ​

dax
IF(SUM('Vendas'[Faturamento]) > 100000, "Alto", "Baixo")
sql
CASE WHEN SUM([Vendas].[Faturamento]) > 100000 THEN 'Alto' ELSE 'Baixo' END

Várias faixas ​

dax
VAR total = SUM('Vendas'[Faturamento])
RETURN SWITCH(TRUE(), total < 50000, "Baixo", total < 200000, "Médio", "Alto")

Valor único na linha ​

dax
IF(HASONEVALUE('Clientes'[UF]), SUM('Vendas'[Faturamento]))

Só nas linhas, vazio no total ​

dax
IF(ISINSCOPE('Clientes'[UF]), SUM('Vendas'[Faturamento]))

Só com a UF filtrada ​

dax
IF(ISFILTERED('Clientes'[UF]), SUM('Vendas'[Faturamento]))

Vazio vira zero ​

dax
COALESCE(SUM('Vendas'[Faturamento]), 0)
sql
COALESCE(SUM([Vendas].[Faturamento]), 0)

Regras do cálculo ​

  • Divisão por zero com / dá vazio. DIVIDE dá vazio ou o valor alternativo do terceiro argumento.
  • Com UF nas linhas, CALCULATE(..., UF = "SP") mostra SP em todas as linhas. KEEPFILTERS mantém o filtro da linha.
  • Com UF nas linhas, o SUM(CASE WHEN UF = 'SP' ...) do SQL deixa as outras UFs vazias. Ele só dá o número do CALCULATE sem UF nas linhas.
  • No RANKX, item sem valor no período conta como 0. Em ordem decrescente, fica abaixo dos positivos e acima dos negativos.
  • COUNTROWS conta toda linha e DISTINCTCOUNT conta o vazio como um valor. O COUNT(coluna) e o COUNT(DISTINCT coluna) do SQL deixam o NULL de fora.
  • Funções de tempo usam a coluna de data do calendário. A data da tabela de vendas é recusada.
  • O SQL do Ano anterior usa o período do filtro de data, um ano antes. Não compara cada linha com o mesmo mês do ano anterior.
  • LASTDATE usa a data da própria tabela de estoque ou saldo.
  • Texto entre aspas não aceita { } [ ] $.

Não suportado ​

  • Colunas e tabelas calculadas. O DAX vale só para medidas.
  • Medida SQL dentro de CALCULATE ou de WINDOW.
  • Duas funções de tempo no mesmo CALCULATE. Alternativa: uma dentro da outra, como SAMEPERIODLASTYEAR(DATESYTD(...)).

Diferenças em relação ao Power BI ​

  • A liberação do usuário, o filtro do datamart, a restrição por usuário (RLS) e o filtro padrão da tabela continuam valendo, inclusive com ALL.
  • USERELATIONSHIP usa o relacionamento secundário declarado no app. Não existe relacionamento inativo.
  • Linha sem valor no período atual não aparece, mesmo com valor no ano anterior.
  • ORDERBY com coluna de data segue o agrupamento das linhas: com o mês nas linhas, percorre os meses.