Partilhar via


Utilize variáveis para melhorar as suas fórmulas DAX

Como modelador de dados, escrever and depurar alguns cálculos DAX pode ser um desafio. É comum que requisitos de cálculo complexos geralmente envolvam a escrita de expressões compostas or complexas. Expressões compostas podem envolver o uso de muitas funções aninhadas and 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 and eficientes. As variáveis podem melhorar o desempenho, a fiabilidade, a legibilidade and reduzir a complexidade.

Neste artigo, demonstraremos os três first benefícios usando um exemplo measure para o crescimento das vendas yearacima doyear (YoY). (A fórmula para o crescimento das vendas YoY é as vendas do período, menos as vendas para o mesmo período lastyear, dividido pelas vendas para o mesmo período lastyear.)

Vamos começar com a seguinte definição measure.

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

O measure produz o resultado correto, ainda assim, vamos ver como now pode ser melhorado.

Melhorar o desempenho

Observe que a fórmula repete a expressão que calcula "mesmo período lastyear". Esta fórmula é ineficiente, pois exige que Power BI repita evaluate a mesma expressão duas vezes. A definição de measure pode ser tornada mais eficiente usando uma variável, VAR.

A seguinte definição measure representa uma melhoria. Ele usa uma expressão para atribuir o resultado "mesmo período lastyear" 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)

O measure continua a produzir o resultado correto, and o faz em cerca de metade da consulta time.

Melhorar a legibilidade

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

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 measure a seguir devolve 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 earlier versões do DAX, as variáveis ainda not eram suportadas. Expressões complexas que introduziram novos contextos de filter foram necessárias para usar as funções EARLIERorEARLIESTDAX para fazer referência a contextos externos filter. Infelizmente, os modeladores de dados acharam essas funções difíceis de entender and usar.

As variáveis são sempre avaliadas fora do filters a que se aplica a sua expressão RETURN. Por esse motivo, quando você usa uma variável dentro de um contexto de filter modificado, ela alcança o mesmo resultado que a função EARLIEST. A utilização das funções EARLIERorEARLIEST pode, por conseguinte, ser evitada. Isso significa que você now pode escrever fórmulas menos complexas and mais fáceis de entender.

Considere a seguinte definição de coluna calculada adicionada à tabela Subcategoria. Ele avalia um rank para cada subcategoria product com base na coluna Subcategoria Vendasvalues.

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

A função EARLIER é usada para referir-se à coluna Subcategoria de Vendasvalueno 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 a coluna Subcategory Salesvalueno contexto de linha atual, and a expressão RETURN a usa dentro de um contexto de filter modificado.

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