Usar variáveis para melhorar suas fórmulas DAX

Como modelador de dados, escrever e depurar alguns cálculos DAX pode ser um desafio. É comum que requisitos de cálculo complexos geralmente envolvam a escrita de expressões compostas ou complexas. Expressões compostas podem envolver o uso de muitas funções aninhadas e, possivelmente, a reutilização da lógica de expressão.

O uso de variáveis em suas fórmulas DAX pode ajudá-lo a escrever cálculos mais complexos e eficientes. As variáveis podem melhorar o desempenho, a confiabilidade, a legibilidade e reduzir a complexidade.

Neste artigo, demonstraremos os três primeiros benefícios usando uma medida de exemplo para o crescimento das vendas ano a ano (YoY). (A fórmula para o crescimento das vendas YoY é as vendas do período, menos as vendas do mesmo período do ano passado, divididas pelas vendas do mesmo período do ano passado.)

Vamos começar com a seguinte definição de medida.

Sales YoY Growth % =
DIVIDE(
    ([Sales] - CALCULATE([Sales], PARALLELPERIOD('Date'[Date], -12, MONTH))),
    CALCULATE([Sales], PARALLELPERIOD('Date'[Date], -12, MONTH))
)

A medida produz o resultado correto, mas vamos agora ver como pode ser melhorada.

Melhorar o desempenho

Observe que a fórmula repete a expressão que calcula "mesmo período do ano passado". Essa fórmula é ineficiente, pois exige que o Power BI avalie a mesma expressão duas vezes. A definição da medida pode ser tornada mais eficiente usando uma variável, VAR.

A seguinte definição de medida representa uma melhoria. Ele usa uma expressão para atribuir o resultado "mesmo período do ano passado" a uma variável chamada SalesPriorYear. A variável é então usada duas vezes na expressão RETURN.

Sales YoY Growth % =
VAR SalesPriorYear =
    CALCULATE([Sales], PARALLELPERIOD('Date'[Date], -12, MONTH))
RETURN
    DIVIDE(([Sales] - SalesPriorYear), SalesPriorYear)

A medida continua a produzir o resultado correto, e fá-lo em cerca de metade do tempo de consulta.

Melhorar a legibilidade

Na definição de medida anterior, observe como a escolha do nome da variável torna a expressão RETURN mais simples de entender. A expressão é curta e auto-descrita.

Simplifique a depuração

As variáveis também podem ajudá-lo a depurar uma fórmula. Para testar uma expressão atribuída a uma variável, reescreva temporariamente a expressão RETURN para produzir a variável.

A definição de medida a seguir retorna apenas a variável SalesPriorYear . Observe como ele comenta a expressão RETURN pretendida. Essa técnica permite que você reverta facilmente assim que a depuração for concluída.

Sales YoY Growth % =
VAR SalesPriorYear =
    CALCULATE([Sales], PARALLELPERIOD('Date'[Date], -12, MONTH))
RETURN
    --DIVIDE(([Sales] - SalesPriorYear), SalesPriorYear)
    SalesPriorYear

Reduzir a complexidade

Em versões anteriores do DAX, as variáveis ainda não eram suportadas. Expressões complexas que introduziram novos contextos de filtro foram necessárias para usar as funções DAX EARLIER ou EARLIEST para fazer referência a contextos de filtro externos. Infelizmente, os modeladores de dados acharam essas funções difíceis de entender e usar.

As variáveis são sempre avaliadas fora dos filtros que sua expressão RETURN aplica. Por esse motivo, quando você usa uma variável dentro de um contexto de filtro modificado, ela alcança o mesmo resultado que a função EARLIEST . A utilização das funções EARLIER ou EARLIEST pode, portanto, ser evitada. Isso significa que agora você pode escrever fórmulas menos complexas e mais fáceis de entender.

Considere a seguinte definição de coluna calculada adicionada à tabela Subcategoria . Ele avalia uma classificação para cada subcategoria de produto com base nos valores da coluna Vendas da subcategoria.

Subcategory Sales Rank =
COUNTROWS(
    FILTER(
        Subcategory,
        EARLIER(Subcategory[Subcategory Sales]) < Subcategory[Subcategory Sales]
    )
) + 1

A função EARLIER é usada para se referir ao valor da coluna Subcategory Sales no contexto de linha atual.

A definição de coluna calculada pode ser melhorada usando uma variável em vez da função ANTERIOR. A variável CurrentSubcategorySales armazena o valor da coluna Subcategory Sales no contexto de linha atual e a expressão RETURN o usa em um contexto de filtro modificado.

Subcategory Sales Rank =
VAR CurrentSubcategorySales = Subcategory[Subcategory Sales]
RETURN
    COUNTROWS(
        FILTER(
            Subcategory,
            CurrentSubcategorySales < Subcategory[Subcategory Sales]
        )
    ) + 1