Calculando MÉDIAS com DAX

E aí, tudo bem?! O conteúdo de hoje será sobre DAX.
Nosso objetivo será calcular:
- Ticket Médio
- Preço unitário médio
- Faturamento médio diário
- Faturamento médio diário no mês
Base de Dados
Nossa tabela fato consiste possui as notas fiscais e produtos vendidos para cada nota (quantidade, preço e valor da venda).

Como você faria para calcular o ticket médio de todas as vendas, ou seja, o valor médio de cada venda?
Se você pensou em fazer a média da coluna Valor Venda, você provavelmente não se atentou ao fato de que há mais de uma linha para cada Nfe. E como cada venda é representada por uma Nfe diferente, não podemos fazer dessa forma.
Ticket Médio
Primeiro vamos criar um cartão com a média do valor de vendas arrastando a coluna Valor Venda no campo desse visual apenas para comparar com o que faremos via DAX.

Para calcular a média do Valor venda precisamos do total desse valor (soma) e da quntidade, certo?!
A soma da venda será dada por:
Faturamento =SUM ( fVendas[Valor Venda] )
A quantidade será:
Qtd Vendas =DISTINCTCOUNT ( fVendas[Nfe] )
Ao usar o DISTINCTCOUNT você está obtendo a soma da quantidade de vendas considerando apenas Nfe’s distintas.
Então o faturamento por Nfe (Ticket Médio) será a divisão desses dois valores:
Ticket Médio =DIVIDE (
[Faturamento],
[Qtd Vendas]
)
Podemos calcular esse Ticket Médio numa medida só usano AVERAGEX e VALUES, veja:
Faturamento Diário AVERAGEX =AVERAGEX (
VALUES ( dCalendario[Date] ),
[Faturamento]
)
Note que o resultado que tivemos arrastando a coluna Valor Venda para o cartão é diferente do que calculamos via DAX (Ticket Médio) porque no primeiro apenas fizemos o valor médio da coluna Valor Venda sem levar em conta as Nfe’s. Beleza?!

Durante a Live#32, um participante perguntou:
E se eu precisar agrupar por mais de uma coluna?
Nesse caso, você poderia utilizar o SUMMARIZE. Veja um exemplo:
Ticket Médio AVERAGEX e SUMMARIZE =AVERAGEX (
SUMMARIZE (
fvendas,
fVendas[Nfe],
fVendas[Produto]
),
[Faturamento]
)
Preço Unitário Médio
Usando a própria coluna com Preço Unitário, a média fica assim:

Para levar em conta a Nfe, precisamos calcular da seguinte forma:
Preço Un. Médio Venda =DIVIDE (
[Faturamento],
SUM ( fVendas[Quantidade] )
)
Compare os dois valores para essa Nfe:

Faturamento Médio Diário
Há algumas formas e calcular o faturamento médio diário.
Com AVERAGEX:
Faturamento Diário AVERAGEX =AVERAGEX (
VALUES ( dCalendario[Date] ),
[Faturamento]
)
Com DIVIDE e DISTINCTCOUNT:
Faturamento Diário DIVIDE =DIVIDE (
[Faturamento],
DISTINCTCOUNT ( fVendas[Data] )
)
Repare que aqui eu estou utilizando a coluna [Date] da tabela fVendas porque quero calcular o faturamento médio somente considerando dias que tiveram venda, beleza?!
Você deve estar se perguntando porque eu utilizei a coluna [Date] da tabela dCalendario e não da tabela fVendas.
É que nos dias que eu não tive faturamento, o AVERAGEX vai retornar um valor em branco. Entendeu?!
E se você precisar mostrar essa média num gráfico de barras no qual o Eixo X estão os dias , como você deveria fazer?
Se utilizarmos qualquer uma dessas duas medidas que acabamos de criar (Faturamento Diário), o gráfico ficará assim:

Porque Repare que precisaremos utilizar o conceito de contexto para ajustar nossa medida:
Faturamento Diário Geral =VAR vMedia =
CALCULATE (
[Faturamento Diário DIVIDE],
ALL ( dCalendario )
)
RETURN
IF (
[Faturamento]
<> BLANK (),
vMedia
)
Note que usamos a função ALL na CALCULATE porque precisamos garantir que essa média fique constante ao longo do Eixo X, certo?!
Relembrando:
ALL: Retorna todas as linhas de uma tabela ou todos os valores de uma coluna, ignorando todos os filtros que estiverem aplicados. Essa função é útil para limpar filtros e criar cálculos em todas as linhas em uma tabela.

Faturamento diário no mês
Para calcularmos o faturamento diário de forma que a média mude a cada mês, devemos adicionar somente um trecho novo na fórmula em relação à anterior, veja:
Faturamento Diário no Mês =VAR vMedia =
CALCULATE (
[Faturamento Diário DIVIDE],
ALL ( dCalendario ),
VALUES ( dCalendario[Date].[Month] )
)
RETURN
IF (
[Faturamento]
<> BLANK (),
vMedia
)
Note que inserimos mais um argumento na CALCULATE: a função VALUES. Como não temos uma coluna de mês na base, utilizamos a hierarquia nativa da nossa dCalendario (é esse .[Month]).
Bora ver como ficou?!

Se você reparar na figura acima também alteramos a curva para ficar no modo “nível”. Para isso, ativamos essa opção em Formato → Nível na seção Formas.
Bom, até aqui matamos tudo que queríamos né?!

Mas, ainda não acabou…
Durante a live me pediram para calcular a média considerando os dias úteis.
Faturamento médio diário – dias úteis
Se você der uma olhada com calma na nossa tabela e nos cálculos que fizemos vai notar que nós dividimos o faturamento diário pelo número de dias, independente se esse dia era ‘útil’ ou não.
Para matar esse problema iremos primeiro adicionar uma coluna na dCalendario com a classificação do dia em Útil e não útil.
Para fazer isso, clique na tabela dCalendario com o botão direito em “Nova Coluna”. Depois insira a fórmula:
Dia Util =VAR vWeekday =
WEEKDAY ( dCalendario[Date] )
RETURN
IF (
vWeekday = 1
|| vWeekday = 7,
“Não Útil”,
“Útil”
)
Para simplificar nós consideramos como “Dia útil” aquele compreendido entre Segunda e Sexta-feira, ok?! Você já deve ter percebido, mas não custa ressaltar: a função WEEKDAY considera Domingo como “1” e Sábado como “7”).
Próximo passo será ajustar nossa medida para que a gente considere no ‘denominador’ apenas esses dias úteis através de um filtro na CALCULATE, veja:
Faturamento Diário – Dias Úteis =VAR vDiasUteis =
CALCULATE (
COUNTROWS ( dCalendario ),
dCalendario[Dia Util] = “Útil”
)
VAR vMedia =
DIVIDE (
[Faturamento],
vDiasUteis
)
RETURN
vMedia
Resultado:

Olha que legal! A média ficou bem maior porque agora nosso ‘denominador’ da fórmula da média ficou menor. Faz sentido, né?!
Se você acha que acabou, calma aí!
Um participante durante a live também me pediu para fazer o cálculo da média móvel!
Média Móvel
Para esse exemplo, eu peguei uma base de dados um pouco maior para vocês conseguirem ver melhor o resultado da medida, beleza?!
Quando você olha esse gráfico de faturamento por dia, percebe que fica difícil identificar as tendências nesse período específico.
O pessoal do mercado financeiro costuma suavizar esses altos e baixos para através de média móvel.

Vamos supor que você precise calcular a média dos últimos 180 dias para cada dia do Eixo X. Veja que não tem mistério:
Média Móvel 180 Dias =AVERAGEX (
DATESINPERIOD (
dCalendario[Data],
MAX ( dCalendario[Data] ),
-180,
DAY
),
[Total Vendas]
)

Agora sim, fechou!
O conteúdo de hoje foi mais curtinho mas espero que tenha te ajudado porque em algum momento na sua vida você precisará calcular uma média em DAX.
Abraços,
Leonardo.
Continue por aqui
Projeção de Valores com DAX
Hoje iremos falar sobre projeção de valores com DAX, e te mostrarei que o segredo está no entendimento dos contextos.
Aprenda a criar valores dinâmicos com parâmetros de campo no Power BI
Aprenda a criar valores dinâmicos com parâmetros de campo no Power BI de forma prática em DAX.
Como remover o “Em branco” dos Cartões no Power BI
Descubra nesta postagem como treinar o seu time da forma mais segura, prática e rentável. Clique aqui e veja o artigo completo.
Do Excel para Contexto de Filtro, Modelos de Dados e Linguagem DAX
Vamos abordar assuntos do nível básico ao avançado, passando por tópicos como modelagem de dados, contextos de filtro e de linha, relacionamentos, cruzamento entre diferentes tabelas, comparativo de vendas com metas, diluição de meta, enfim... Um artigo completo para você começar a praticar e automatizar os seus processos, eliminando tarefas repetitivas.


