Analisando Funções DAX no Power BI: Um Estudo de Caso Prático
No contexto empresarial, a análise de dados de vendas é essencial para a tomada de decisões estratégicas. Um desafio comum é comparar o desempenho de vendas entre meses consecutivos. No entanto, a simples comparação de datas pode ser inadequada, pois o número de dias úteis (de segunda a sexta-feira) varia a cada mês. Por exemplo, um mês pode começar em uma terça-feira, enquanto o mês anterior começou em uma sexta-feira, resultando em um número diferente de dias úteis até a mesma data do mês seguinte. Para uma análise justa e precisa, é crucial comparar períodos com o mesmo número de dias úteis. Neste artigo, explorarei como resolver essa questão usando Power BI e DAX, destacando a criação de uma coluna de sequência no calendário e uma medida para calcular o total em reais das vendas do mês anterior.
Criando a Coluna de Sequência no Calendário
Para resolver a questão de comparar períodos que começam em diferentes dias da semana, criei uma coluna de sequência no calendário que conta apenas os dias úteis (segunda a sexta-feira).
Código DAX
Sequencia =
VAR CurrentDate = 'dCalendário'[Date]
VAR CurrentMonthStart = STARTOFMONTH('dCalendário'[Date])
VAR DaysSinceStartOfMonth =
CALCULATE(
COUNTROWS('dCalendário'),
FILTER(
ALL('dCalendário'),
'dCalendário'[Date] >= CurrentMonthStart &&
'dCalendário'[Date] <= CurrentDate &&
'dCalendário'[Dia da Semana] = "SIM"
)
)
VAR LastValidCount =
CALCULATE(
MAX('dCalendário'[Sequencia]),
FILTER(
ALL('dCalendário'),
'dCalendário'[Date] < CurrentDate &&
'dCalendário'[Dia da Semana] = "SIM"
)
)
RETURN
IF(
'dCalendário'[Dia da Semana] = "SIM",
DaysSinceStartOfMonth,
LastValidCount
)
Explicação das Funções Utilizadas
- CALCULATE
- A função `calculate` avalia uma expressão modificada por filtros. No nosso caso, `calculate` é usada para contar os dias úteis desde o início do mês atual e para obter o valor máximo da sequência de dias úteis até a data atual.
- Exemplo Prático:
VAR DaysSinceStartOfMonth =
CALCULATE(
COUNTROWS('dCalendário'),
FILTER(
ALL('dCalendário'),
'dCalendário'[Date] >= CurrentMonthStart &&
'dCalendário'[Date] <= CurrentDate &&
'dCalendário'[Dia da Semana] = "SIM"
)
)
- FILTER
- A função `filter` retorna uma tabela que representa um subconjunto de outra tabela ou expressão. Aqui, `filter` é usada dentro do `calculate` para restringir as linhas da tabela de calendário aos dias úteis entre o início do mês e a data atual.
- Exemplo Prático:
FILTER(
ALL('dCalendário'),
'dCalendário'[Date] >= CurrentMonthStart &&
'dCalendário'[Date] <= CurrentDate &&
'dCalendário'[Dia da Semana] = "SIM"
)
- ALL
- A função `all` retorna todas as linhas de uma tabela ou todas as colunas de uma tabela, ignorando os filtros aplicados. No nosso caso, `all` é usada para ignorar os filtros de contexto e permitir que o `filter` selecione todas as datas do calendário.
- Exemplo Prático:
ALL('dCalendário')
- MAX
- A função `max` retorna o maior valor em uma coluna. Aqui, é usada para obter a maior sequência válida de dias úteis antes da data atual.
- Exemplo Prático:
VAR LastValidCount =
CALCULATE(
MAX('dCalendário'[Sequencia]),
FILTER(
ALL('dCalendário'),
'dCalendário'[Date] < CurrentDate &&
'dCalendário'[Dia da Semana] = "SIM"
)
)
Criando a Medida para Calcular o Total de Vendas do Mês Anterior
Agora, iremos criar a medida para calcular o total em reais das vendas no mês anterior, considerando a sequência de dias úteis.
Código DAX
R$_Vendas_Mes_Anterior =
VAR DataMinimaFiltro = CALCULATE(MIN('dCalendário'[Date]), ALLSELECTED('dCalendário'))
VAR DataMaximaFiltro = CALCULATE(MAX('dCalendário'[Date]), ALLSELECTED('dCalendário'))
VAR SequenciaDataFinal = CALCULATE(
MAX('dCalendário'[Sequencia]),
'dCalendário'[Date] = DataMaximaFiltro
)
VAR MesAnterior = MONTH(DataMinimaFiltro) - 1
VAR AnoAnterior = IF(MesAnterior = 0, YEAR(DataMinimaFiltro) - 1, YEAR(DataMinimaFiltro))
VAR SequenciaMinimaMesAnterior = CALCULATE(
MIN('dCalendário'[Sequencia]),
'dCalendário'[Ano] = AnoAnterior,
'dCalendário'[Mes] = MesAnterior
)
RETURN
CALCULATE(
SUM(FATO_VENDAS[VL_R$]),
FILTER(
ALL('dCalendário'),
'dCalendário'[Ano] = AnoAnterior &&
'dCalendário'[Mes] = MesAnterior &&
'dCalendário'[Sequencia] >= SequenciaMinimaMesAnterior &&
'dCalendário'[Sequencia] <= SequenciaDataFinal
)
)
Explicação das Funções Utilizadas
- MIN
- A função `min` retorna o menor valor em uma coluna. Aqui, é usada para obter a menor data do filtro aplicado.
- Exemplo Prático:
VAR DataMinimaFiltro = CALCULATE(MIN('dCalendário'[Date]), ALLSELECTED('dCalendário'))
- SUM
- A função `sum` adiciona todos os números em uma coluna. No nosso caso, é usada para somar os valores de vendas.
- Exemplo Prático:
CALCULATE(
SUM(FATO_VENDAS[VL_R$]),
FILTER(
ALL('dCalendário'),
'dCalendário'[Ano] = AnoAnterior &&
'dCalendário'[Mes] = MesAnterior &&
'dCalendário'[Sequencia] >= SequenciaMinimaMesAnterior &&
'dCalendário'[Sequencia] <= SequenciaDataFinal
)
)
Neste artigo, exploramos como resolver um problema específico de análise de vendas usando Power BI e DAX. Destaquei a criação de uma coluna de sequência no calendário e uma medida para calcular o total de vendas do mês anterior. Expliquei detalhadamente as funções DAX utilizadas, incluindo `calculate`, `filter`, `all`, `max`, `min`, e `sum`, demonstrando como aplicá-las em um cenário prático. Compreender essas funções e suas aplicações é fundamental para realizar análises complexas e obter insights valiosos dos dados empresariais.