DAX: Usar variáveis para melhorar as fórmulasDAX: Use variables to improve your formulas

Para um modelador de dados, escrever e depurar alguns cálculos DAX pode ser desafiador.As a data modeler, writing and debugging some DAX calculations can be challenging. É comum que requisitos de cálculos complexos envolvam escrever expressões compostas ou complexas.It's common that complex calculation requirements often involve writing compound or complex expressions. Expressões compostas podem envolver o uso de muitas funções aninhadas e, possivelmente, a reutilização da lógica de expressão.Compound expressions can involve the use of many nested functions, and possibly the reuse of expression logic.

Usar variáveis em suas fórmulas DAX ajuda você a escrever cálculos complexos e eficientes.Using variables in your DAX formulas helps you write complex and efficient calculations. As variáveis podem:Variables can:

Neste artigo, demonstraremos os três primeiros benefícios usando uma medida de exemplo para o crescimento de vendas ano a ano (YoY).In this article, we'll demonstrate the first three benefits by using an example measure for year-over-year (YoY) sales growth. (A fórmula para o crescimento de vendas YoY é: vendas no período _menos vendas no mesmo período do ano anterior, dividido por vendas para o mesmo período do ano anterior.)(The formula for YoY sales growth is: period sales _fewer sales for the same period last year, divided by sales for the same period last year.)

Vamos começar com a definição da medida a seguir.Let's start with the following measure definition.

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.The measure produces the correct result, yet let's now see how it can be improved.

Melhorar o desempenhoImprove performance

Observe que a fórmula repete a expressão que calcula "o mesmo período no ano anterior".Notice that the formula repeats the expression that calculates "same period last year". Essa fórmula não é eficiente, pois exige que o Power BI avalie a mesma expressão duas vezes.This formula is inefficient, as it requires Power BI to evaluate the same expression twice. A definição da medida pode se tornar mais eficiente usando uma variável.The measure definition can be made more efficient by using a variable.

A definição de medida a seguir representa uma melhoria.The following measure definition represents an improvement. Ela usa uma expressão para atribuir o resultado do "mesmo período do ano anterior" a uma variável chamada SalesPriorYear.It uses an expression to assign the "same period last year" result to a variable named SalesPriorYear. Em seguida, a variável é usada duas vezes na expressão RETURN.The variable is then used twice in the RETURN expression.

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

A medida continua produzindo o resultado correto e faz isso em cerca de metade do tempo de consulta.The measure continues to produce the correct result, and does so in about half the query time.

Melhorar a legibilidadeImprove readability

Na definição de medida anterior, observe como a escolha do nome da variável torna a expressão RETURN mais simples de entender.In the previous measure definition, notice how the choice of variable name makes the RETURN expression simpler to understand. A expressão é curta e autodescritiva.The expression is short and self-describing.

Simplificar a depuraçãoSimplify debugging

As variáveis também podem ajudar a depurar uma fórmula.Variables can also help you debug a formula. Para testar uma expressão atribuída a uma variável, você reescreve temporariamente a expressão RETURN para gerar a variável.To test an expression assigned to a variable, you temporarily rewrite the RETURN expression to output the variable.

A definição de medida a seguir retorna apenas a variável SalesPriorYear.The following measure definition returns only the SalesPriorYear variable. Observe como ele comenta a expressão RETURN pretendida.Notice how it comments-out the intended RETURN expression. Essa técnica permite que você a reverta facilmente quando a depuração for concluída.This technique allows you to easily revert it back once your debugging is complete.

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

Reduzir a complexidadeReduce complexity

Em versões anteriores do DAX, ainda não havia suporte para variáveis.In earlier versions of DAX, variables were not yet supported. Expressões complexas que introduziam novos contextos de filtro precisavam usar as funções DAX EARLIER ou EARLIEST para referenciar contextos de filtro externos.Complex expressions that introduced new filter contexts were required to use the EARLIER or EARLIEST DAX functions to reference outer filter contexts. Os modeladores de dados consideravam essas funções difíceis de entender e usar.Unfortunately, data modelers found these functions difficult to understand and use.

As variáveis sempre são avaliadas fora dos filtros que sua expressão RETURN aplica.Variables are always evaluated outside the filters your RETURN expression applies. Por esse motivo, quando você usa uma variável em um contexto de filtro modificado, ela chega ao mesmo resultado que a função EARLIEST.For this reason, when you use a variable within a modified filter context, it achieves the same result as the EARLIEST function. Portanto, o uso das funções EARLIER ou EARLIEST pode ser evitado.The use of the EARLIER or EARLIEST functions can therefore be avoided. Isso significa que agora você pode escrever fórmulas que são menos complexas e mais fáceis de entender.It means you can now write formulas that are less complex, and that are easier to understand.

Considere a seguinte definição de coluna calculada adicionada à tabela Subcategoria.Consider the following calculated column definition added to the Subcategory table. Ela avalia uma classificação para cada subcategoria de produto com base nos valores da coluna Vendas da subcategoria.It evaluates a rank for each product subcategory based on the Subcategory Sales column values.

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

A função EARLIER é usada para fazer referência ao valor da coluna Vendas da subcategoriano contexto da linha atual.The EARLIER function is used to refer to the Subcategory Sales column value in the current row context.

A definição da coluna calculada pode ser aprimorada usando uma variável em vez da função EARLIER.The calculated column definition can be improved by using a variable instead of the EARLIER function. A variável CurrentSubcategorySales armazena o valor da coluna Vendas da subcategoriano contexto da linha atual e a expressão RETURN a usa em um contexto de filtro modificado.The CurrentSubcategorySales variable stores the Subcategory Sales column value in the current row context, and the RETURN expression uses it within a modified filter context.

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

Próximas etapasNext steps

Para obter mais informações sobre este artigo, confira os seguintes recursos:For more information about this article, check out the following resources: