Uso de variables para mejorar las fórmulas DAX

Como modelador de datos, escribir y depurar algunos cálculos DAX puede ser complejo. Es habitual que los requisitos de cálculos complejos impliquen a menudo la escritura de expresiones compuestas o complejas. Las expresiones compuestas pueden implicar el uso de muchas funciones anidadas y, posiblemente, la reutilización de la lógica de expresión.

El uso de variables en las fórmulas DAX puede ayudarle a escribir cálculos complejos y eficaces. Las variables pueden mejorar el rendimiento, la fiabilidad y la legibilidad, y reducir la complejidad.

En este artículo se mostrarán las tres primeras ventajas con una medida de ejemplo para el crecimiento de ventas de año a año (YoY). (La fórmula del crecimiento de ventas YoY es la siguiente: ventas por periodo, menos ventas del mismo periodo del año pasado, dividido por las ventas del mismo periodo del año pasado).

Comencemos con la siguiente definición de medida.

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

La medida genera el resultado correcto, pero veamos cómo se puede mejorar.

Mejorar el rendimiento

Observe que la fórmula repite la expresión que calcula "el mismo período del año pasado". Esta fórmula es ineficaz, ya que fuerza a Power BI a evaluar la misma expresión dos veces. La definición de la medida se puede hacer más eficaz usando una variable, VAR.

La siguiente definición de medida representa una mejora. Usa una expresión para asignar el resultado "del mismo período del año pasado" a una variable denominada SalesPriorYear. Entonces, la variable se usa dos veces en la expresión RETURN.

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

La medida sigue generando el resultado correcto y lo hace en más o menos la mitad del tiempo de consulta.

Mejorar la legibilidad

En la definición de medida anterior, observe cómo la elección del nombre de la variable hace que la expresión RETURN sea más fácil de entender. La expresión es breve y autodescriptiva.

Simplificar la depuración

Las variables también pueden ayudarle a depurar una fórmula. Para probar una expresión asignada a una variable, debe reescribir temporalmente la expresión RETURN para generar la variable.

La siguiente definición de medida solo devuelve la variable SalesPriorYear. Observe cómo quita la marca de comentario de la expresión RETURN deseada. Con esta técnica puede revertirla fácilmente una vez concluida la depuración.

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

Reducir la complejidad

En versiones anteriores de DAX, las variables aún no eran compatibles. Las expresiones complejas que incorporaban nuevos contextos de filtro eran necesarias para usar las funciones DAX EARLIER o EARLIEST para hacer referencia a contextos de filtro externos. Desafortunadamente, para los modeladores de datos estas funciones eran difíciles de comprender y de usar.

Las variables siempre se evalúan fuera de los filtros a los que se aplica la expresión RETURN. Por este motivo, a la hora de usar una variable dentro de un contexto de filtro modificado, se obtiene el mismo resultado que con la función EARLIEST. Por lo tanto, se puede evitar el uso de las funciones EARLIER o EARLIEST. Es decir, ahora puede escribir fórmulas menos complejas y más fáciles de entender.

Observe la siguiente definición de columna calculada que se ha agregado a la tabla Subcategoría. Evalúa un rango para cada subcategoría de producto en función de los valores de la columna Subcategory Sales (Ventas por subcategoría).

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

La función EARLIER sirve para hacer referencia al valor de la columna Subcategory Salesen el contexto de fila actual.

La definición de la columna calculada se puede mejorar usando una variable en lugar de la función EARLIER. La variable CurrentSubcategorySales almacena el valor de la columna Subcategory Salesen el contexto de fila actual y la expresión RETURN la usa en un contexto de filtro modificado.

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