Emulación de la función TOTALYTD

La función TOTALYTD es fácil de usar y nos permite calcular rápidamente el resultado de una expresión para el período transcurrido entre el 1 de enero y la última fecha del contexto actual, pero en ocasiones nos encontraremos con que necesitamos un mayor control sobre la expresión evaluada. En este escenario vamos a simular la función TOTALYTD utilizando otras funciones que nos permitirían ese control adicional.

Partimos de una tabla denominada Movements donde encontramos movimientos financieros asociados a una fecha (supongamos que se trata de ventas):

Tabla de movimientos

Por otro lado, por supuesto, tenemos una tabla conteniendo un calendario (tabla Calendar):

Calendario

Ambas tablas están relacionadas por el campo de fecha. Para simular la función TOTALYTD queremos calcular el acumulado del campo Movements[Total] desde principio de año (del período involucrado en el contexto actual) hasta la última fecha del "período actual".

La expresión base será la suma del campo Movements[Total], expresión que servirá de primer argumento de la función CALCULATE, a la que deberemos añadir como segundo argumento la modificación del contexto de filtro a aplicar. En pseudo-código, la medida a crear es la siguiente:

Running Total = 
    CALCULATE(
        SUM(Movements[Total]),
        Período entre el 1 de enero del año actual hasta el último día del período actual
    )

Para el cálculo del período en cuestión (entre el 1 de enero del año correspondiente y el último día del contexto actual) podemos recurrir a filtrar la tabla Calendar con la función FILTER de forma que, dado un contexto actual, seleccione aquellos registros del calendario que involucren las fechas de interés. Es decir, nuestro pseudo-código quedaría así:

Running Total = 
    CALCULATE(
        SUM(Movements[Total]),
        FILTER(
            Calendar,
            Período entre el 1 de enero del año actual hasta el último día del período actual
        )
    )

Con la función MAX aplicada al calendario podemos calcular tanto el último día del contexto actual (aplicando la función al campo Date) como el año siendo considerado (aplicando la función al campo Año), por lo que para extraer el período de interés podríamos imponer dos condiciones:

  1. Que la fecha del calendario sea inferior al último día del contexto actual
  2. Que el año del calendario sea igual al año del contexto actual

Es decir:

 Running Total = 
    CALCULATE(
        SUM(Movements[Total]),
        FILTER(
            Calendar,
            Fecha del calendario anterior al último día del contexto actual Y
            Año del calendario igual al año del contexto actual
        )
    )

Llevando los campos y funciones reales al pseudo-código anterior tenemos:

Running Total = 
    CALCULATE(
        SUM(Movements[Total]),
        FILTER(
            ALL('Calendar'),
            'Calendar'[Date] <= MAX('Calendar'[Date]) &&
            'Calendar'[Año] = MAX('Calendar'[Año]
            )
        )
    )

Código final

Debemos asegurarnos de que la tabla Calendar no está siendo filtrada, por lo que se aplica la función ALL (de otro modo se contextualizaría y no nos permitiría siempre extraer el período transcurrido desde principio de año).

Funciones DAX involucradas
Dificultad
Intermedia
Enviado por admin el Vie, 05/07/2019 - 18:42