Compartir a través de


Usa variables para mejorar tus fórmulas DAX

Como modelador de datos, escribir y depurar algunos DAX cálculos puede ser desafiante. Es habitual que los requisitos de cálculo complejos suelen implicar 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 expresiones.

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

En este artículo, demostraremos las tres primeras ventajas mediante una medida de ejemplo para el crecimiento de las ventas de año a año (YoY). (La fórmula para el crecimiento de las ventas yoY es las ventas del período, menos las ventas del mismo período del año pasado, divididas por las ventas del mismo período 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 ahora veremos cómo se puede mejorar.

Mejora del rendimiento

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

La siguiente definición de medida representa una mejora. Usa una expresión para asignar el resultado "mismo período del año pasado" a una variable denominada SalesPriorYear. A continuación, 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 continúa produciendo el resultado correcto y lo hace aproximadamente a la mitad del tiempo de consulta.

Mejora de la legibilidad

En la definición de medida anterior, observe cómo la elección del nombre de variable simplifica la comprensión de la expresión RETURN. La expresión es breve y autodescripta.

Simplificar la depuración

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

La siguiente definición de medida devuelve solo 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, aún no se admitían variables. Se requerían expresiones complejas que introdujeron nuevos contextos de filtro para usar las EARLIER funciones o EARLIESTDAX para hacer referencia a contextos de filtro externos. Desafortunadamente, los modeladores de datos encontraron estas funciones difíciles de entender y usar.

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

Tenga en cuenta la siguiente definición de columna calculada agregada a la tabla Subcategory . Evalúa una clasificación para cada subcategoría de producto en función de los valores de la columna Subcategory Sales .

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

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

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

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