Compartilhar via


Use variáveis para melhorar suas fórmulas de DAX

Como modelador de dados, escrever e depurar alguns cálculos do DAX pode ser desafiador. É 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 várias funções aninhadas e, possivelmente, a reutilização da lógica de expressão.

Usar variáveis em suas fórmulas de 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 ano sobre ano é: vendas do período, menos as vendas do mesmo período do ano passado, dividido pelas vendas do mesmo período do ano passado.)

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

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 agora vamos ver como ela 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 mais eficiente usando uma variável, VAR.

A definição de medida a seguir representa uma melhoria. Ele usa uma expressão para atribuir o resultado do "mesmo período do ano passado" a uma variável chamada SalesPriorYear. Em seguida, a variável é 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 o faz 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 autoexplicativa.

Simplificar 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 gerar 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ê a reverta facilmente quando 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

Nas versões anteriores do DAX, as variáveis ainda não tinham suporte. Expressões complexas que introduziram novos contextos de filtro eram necessárias para usar as funções EARLIER ou EARLIESTDAX para referenciar contextos de filtro externo. 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 em um contexto de filtro modificado, ela obtém o mesmo resultado que a função EARLIEST. Portanto, o uso das funções EARLIER ou EARLIEST pode ser evitado. Isso significa que agora você pode escrever fórmulas menos complexas e que são mais fáceis de entender.

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

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 aprimorada usando uma variável em vez da função EARLIER. A variável CurrentSubcategorySales armazena o valor da coluna Subcategory Sales no contexto da linha atual e a expressão RETURN a usa em um contexto de filtro modificado.

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