La medida [Sales Pct]

La única diferencia entre las tres medidas es el cálculo de las ventas “del nivel superior”, de forma que, si quisiéramos combinar las tres medidas en una sola (en nuestra medida [Sales Pct]) podríamos, simplemente, usar la función IF para comprobar en qué nivel jerárquico nos encontramos y hacer un cálculo u otro en función del resultado. Recordemos el cuerpo de nuestra medida [Sales Pct]:

Sales Pct =
VAR __currentSales = [Sales]
VAR __parentSales = 1
RETURN
    DIVIDE(
        __currentSales,
        __parentSales
    )

Los cambios hay que introducirlos en la definición de la variable __parentSales y podrían ser los siguientes:

VAR __parentSales =
    IF(
        ISINSCOPE('Calendar'[Date].[Mes]),
        CALCULATE(
            [Sales],
            PARALLELPERIOD('Calendar'[Date], 0, QUARTER)
        ),
        IF(
            ISINSCOPE('Calendar'[Date].[Trimestre]),
            CALCULATE(
                [Sales],
                PARALLELPERIOD('Calendar'[Date], 0, YEAR)
            ),
            CALCULATE(
                [Sales],
                ALL('Calendar')
            )
        )
    )

Como vemos, tenemos dos IF’s anidados: el primero comprueba si el nivel jerárquico actual es el de meses y, en caso positivo, devuelve las ventas para el trimestre al que pertenece el mes correspondiente. En caso negativo volvemos a usar la función IF para confirmar si el nivel jerárquico es el trimestre, en cuyo caso se devuelven las ventas del año al que pertenece el trimestre correspondiente. Si no se cumple es porque estamos a nivel de años, y, en este caso, se devuelven las ventas totales limpiando de filtros la tabla Calendar.

Una alternativa que supondría un código un poco más ordenado sería usar la función SWITCH:

VAR __parentSales =
    SWITCH(
        TRUE(),
        ISINSCOPE('Calendar'[Date].[Mes]),
        CALCULATE(
            [Sales],
            PARALLELPERIOD('Calendar'[Date], 0, QUARTER)
        ),
        ISINSCOPE('Calendar'[Date].[Trimestre]),
        CALCULATE(
            [Sales],
            PARALLELPERIOD('Calendar'[Date], 0, YEAR)
        ),
        CALCULATE(
            [Sales],
            ALL('Calendar')
        )
    )

El orden en el que se hacen las comprobaciones es crítico, pues ya hemos visto que la función ISINSCOPE devolvería True si el nivel jerárquico fuese el de años o inferior. Es decir, en nuestro caso devolvería True siempre pues no hay niveles jerárquicos por encima del anual. Si la primera comprobación que hiciésemos fuese esa (que el nivel jerárquico es el de año) siempre se cumpliría.

Si añadimos el código anterior al cuerpo de la medida [Sales Pct]:

Sales Pct =
VAR __currentSales = [Sales]
VAR __parentSales =
    SWITCH(
        TRUE(),
        ISINSCOPE('Calendar'[Date].[Mes]),
        CALCULATE(
            [Sales],
            PARALLELPERIOD('Calendar'[Date], 0, QUARTER)
        ),
        ISINSCOPE('Calendar'[Date].[Trimestre]),
        CALCULATE(
            [Sales],
            PARALLELPERIOD('Calendar'[Date], 0, YEAR)
        ),
        CALCULATE(
            [Sales],
            ALL('Calendar')
        )
    )
RETURN
    DIVIDE(
        __currentSales,
        __parentSales
    )

y llevamos la medida a nuestra matriz, obtenemos el resultado siguiente:

Sales Pct

resultado que podríamos comprobar que devuelve los valores correctos para todas las filas de la matriz, con independencia del nivel jerárquico de que se trate.