Partilhar via


Utilize variáveis para melhorar as 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. Note que ele comenta a expressão RETURN desejada. 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

Reduza 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 EARLIER ou EARLIESTDAX 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, por conseguinte, 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 Subcategoria Vendas.

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 de Subcategoria de Vendas no contexto da linha atual.

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

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