O objetivo hoje é resolver cases reais utilizando a linguagem DAX, exemplo, ajuste de contexto, diferença entre km atual e anterior, e forecast.
Case 1 – Ajustando o Contexto de Filtro
Neste primeiro case, o objetivo é visualizar o faturamento de 2018 (ano anterior), ao lado do faturamento atual (2019) segmentado por mês/ano em uma matriz, porém, devido a um problema com os contextos, ao colocar o faturamento 2018 no visual os valores ficam em branco.
Isso ocorre porque a coluna utilizada para remover o contexto não está presente no visual, para resolver isso utilizamos a medida abaixo.
Fat 2018 Adaptada =CALCULATE (
[Faturamento];
ALL ( Data );
Data[Ano] = 2018;
//Utiliza uma função ALL na coluna Ano
VALUES ( Data[Mes] );
VALUES ( Data[Dia] )
)
Se quiser que o cálculo leve em consideração o contexto de dia, acrescente o Values [Dia] na medida.
Veja abaixo o resultado final após os ajustes na medida.
Case 2 – Calcular Diferença entre KM Atual e KM Anterior
O primeiro passo é calcular o valor do Km atual linha a linha.
KM Atual =CALCULATE ( AVERAGE ( Abastecimento[KM] ); LASTDATE ( Abastecimento[Data] ) )
Veja o resultado após o cálculo.
Neste cálculo utilizamos o AVERAGE ao invés de SUM para que não haja confusão quando o caminhão abastecer 02 vezes no mesmo dia.
Agora calcule o valor do Km anterior.
KM Anterior =VAR vDataAtual =
MAX ( dCalendario[Date] )
VAR vBem =
SELECTEDVALUE ( Abastecimento[Bem] )
RETURN
CALCULATE (
[KM Atual];
FILTER (
ALL ( Abastecimento );
Abastecimento[Data] < vDataAtual
&& Abastecimento[Bem] = vBem
)
)
Nessa medida utilizamos o ALL, pois, do contrário o contexto iria mostrar o abastecimento anterior, mas considerando só o contexto atual, e o correto é considerar a tabela toda.
Dica: Não pode usar o PREVIOUSDAY ou DATEADD nesse caso, pois, se o abastecimento anterior tiver ocorrido há 3 dias, por exemplo, não irá trazer nenhum valor.
Para uma melhor performance, considere realizar o cálculo do Km anterior através de coluna calculada.
KM Anterior =VAR vKMAtual = Abastecimento[KM]
VAR vBem = Abastecimento[Bem]
RETURN
CALCULATE (
MAX ( Abastecimento[KM] );
FILTER (
ALL ( Abastecimento );
Abastecimento[KM] < vKMAtual
&& Abastecimento[Bem] = vBem
)
)
Agora é só fazer a diferença Km Atual – Km Anterior.
Case 3 – Cálculo de Forecast
O desafio é calcular o forecast considerando apenas os valores do último mês e não o acumulado do ano.
O cálculo é o seguinte:
Forecast Mes =VAR vDataAtual =
MAX ( Data[Data] )
VAR vUltimaData =
CALCULATE ( MAX ( Vendas[DataEmissao] ); ALL ( Data ) )
VAR vDiasNoMes =
COUNTROWS ( Data )
VAR vDiasComVenda =
DAY ( vUltimaData )
VAR vForecast = [Faturamento] * ( vDiasNoMes / vDiasComVenda )
RETURN
IF ( vDataAtual > vUltimaData; vForecast; [Faturamento] )
Note que o total não está fechando.
Para corrigir o total, utilize o SUMX.
Forecast =SUMX ( VALUES ( Data[MesAno] ); [Forecast Mes] )
E se você quiser fazer o cálculo considerando os dias, logo abaixo tem as medidas prontinhas, é só substituir, beleza?!
Dias Uteis com Venda =VAR vUltimoDia =
MAX ( Vendas[DataEmissao] )
VAR vDiaUltimoDia =
INT ( DAY ( vUltimoDia ) )
VAR vResultado =
CALCULATE (
COUNTROWS ( Data );
DATESBETWEEN (
Data[Data];
DATE ( MAX ( Data[Ano] ); MAX ( Data[MesNum] ); 01 );
vUltimoDia
);
NOT ( Data[Dia da Semana] IN { 1; 7 } )
)
RETURN
vResultado
Dias Uteis no Mes =
CALCULATE ( COUNTROWS ( Data ); NOT ( Data[Dia da Semana] IN { 1; 7 } ) )
Case 4 – Projeção de Crescimento
Na tabela de dados mostrada na figura 07, tem o faturamento das lojas 01 e 02, e o objetivo é realizar uma projeção deste faturamento considerando um percentual predefinido, conforme mostra a tabela de projeção na figura 08.
Para realizar esse cálculo, é necessário saber qual o valor vendido no último mês e aplicar o percentual nesse valor.
Dica: Colocar uma coluna que conta a quantidade de meses de forma contínua na tabela dCalendario.
Forecast =VAR vLojaAtual =
SELECTEDVALUE ( dlojas[loja] )
VAR vMesAtual =
SELECTEDVALUE ( dCalendario[Mes Contador] )
VAR vUltimaData =
CALCULATE ( MAX ( fdados[data] ); ALL ( dCalendario ) )
VAR vUltimoMes =
CALCULATE ( MAX ( dCalendario[Mes Contador] ); dCalendario[Data] = vUltimaData )
VAR vUltimoValor =
CALCULATE (
[Faturamento];
ALL ( dCalendario );
dCalendario[Mes Contador] = vUltimoMes
) //VAR vForecast = vUltimoValor * POWER( 1 + vTaxa, vMesAtual – vUltimoMes )
VAR vForecast =
vUltimoValor
* PRODUCTX (
FILTER (
ALL ( dCalendario[Mes Contador]; dCalendario[Início do Mês] );
dCalendario[Mes Contador] <= vMesAtual
&& dCalendario[Mes Contador] > vUltimoMes
);
1
+ LOOKUPVALUE (
fprojecao[taxa];
fprojecao[Data]; dCalendario[Início do Mês];
fprojecao[loja]; vLojaAtual
)
)
RETURN
IF ( vMesAtual > vUltimoMes; vForecast; [Faturamento] )
Para corrigir o total crie uma medida utilizando o SUMX.
Forecast Ajustado =SUMX (
CROSSJOIN ( VALUES ( dlojas[loja] ); VALUES ( dCalendario[Mes-Ano] ) );
[Forecast]
)
Galera, por hoje é isso.
Compartilhe esse post com seus colegas para ajudá-los a resolver cases reais utilizando a linguagem DAX.
Abraços, Léo.