O POWER BI É PARA VOCÊ

Ter visão 360º de sua empresa já é possível com
o Microsoft Power BI.

Maio 21, 2020

Para um modelador de dados, escrever e depurar alguns cálculos DAX pode ser desafiador. É comum que requisitos de cálculos complexos envolvam escrever 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.

Usar variáveis em suas fórmulas DAX ajuda você a escrever cálculos complexos e eficientes. As variáveis podem:

Neste artigo, demonstraremos os três primeiros benefícios usando uma medida de exemplo para o crescimento de vendas ano a ano (YoY). (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.)

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

 

DAX

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 "o mesmo período no ano anterior". Essa fórmula não é eficiente, pois exige que o Power BI avalie a mesma expressão duas vezes. A definição da medida pode se tornar mais eficiente usando uma variável.

A definição de medida a seguir representa uma melhoria. Ela usa uma expressão para atribuir o resultado do "mesmo período do ano anterior" a uma variável chamada SalesPriorYear. Em seguida, a variável é usada duas vezes na expressão RETURN.

 

DAX

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.

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 autodescritiva.

Simplificar a depuração

As variáveis também podem ajudar a depurar uma fórmula. Para testar uma expressão atribuída a uma variável, você reescreve 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.

 

DAX

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, ainda não havia suporte para variáveis. Expressões complexas que introduziam novos contextos de filtro precisavam usar as funções DAX EARLIER ou EARLIEST para referenciar contextos de filtro externos. Os modeladores de dados consideravam essas funções difíceis de entender e usar.

As variáveis sempre são 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 chega ao 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 que são menos complexas e mais fáceis de entender.

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

 

DAX

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.

A definição da coluna calculada pode ser aprimorada usando uma variável em vez da função EARLIER. 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.

 

DAX

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