Cases Reais com DAX

Leonardo Karpinski

Leonardo Karpinski

Mestre do Power BI, criador do Curso Express de Power BI e Curso Completo de Power BI. Formou mais de 16 mil alunos nos últimos anos e participou de projetos em grandes empresas nacionais e multinacionais.

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.

Figura 01 – Mostrando o problema

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.

Figura 11 – Contexto Ajustado

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.

Figura 02 – Km Atual

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.

Figura 03 – Km Atual vs 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.

Figura 04 – Cálculo a ser feito

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 > vUltimaDatavForecast; [Faturamento] )

Note que o total não está fechando.

Figura 05 – Total indevido

Para corrigir o total, utilize o SUMX.

Forecast =
SUMX ( VALUES ( Data[MesAno] ); [Forecast Mes] )

Figura 06 – Total corrigido

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 { 17 } )
    )
RETURN
    vResultado

Dias Uteis no Mes =
CALCULATE ( COUNTROWS ( Data )NOT ( Data[Dia da Semana] IN { 17 } ) )

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.

Figura 07 – Tabela de dados
Figura 09 – Tabela de projeção

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.

Figura 08 – Contador de meses
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 > vUltimoMesvForecast; [Faturamento] )

Para corrigir o total crie uma medida utilizando o SUMX.

Forecast Ajustado =
SUMX (
    CROSSJOIN ( VALUES ( dlojas[loja] )VALUES ( dCalendario[Mes-Ano] ) );
    [Forecast]
)

Figura 10 – Resultado da projeção

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.

Compartilhe este post:
Compartilhar no facebook
Compartilhar no linkedin
Compartilhar no twitter
Compartilhar no pinterest