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]:
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:
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:
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]:
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:
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.