Jerarquías

Un caso particular con el que nos encontramos cuando modelamos métricas con DAX es aquel en el que nuestras medidas se ven involucradas en objetos visuales que incluyen una jerarquía pues, frecuentemente, el cálculo realizado por las medidas puede no tener sentido para todos los niveles jerárquicos, o simplemente podemos necesitar que los cálculos sean diferentes en función del nivel jerárquico.

Un buen ejemplo es el uso de DAX para obtener el porcentaje que un elemento supone con respecto al elemento que lo contiene (al elemento “padre”): Imaginemos una matriz a la que llevamos el campo Calendar[Date] a filas y la medida [Sales] a valores. Y para limitar la complejidad del ejemplo, eliminemos el nivel “Día” de la jerarquía:

Jerarquías

Supongamos ahora que queremos añadir al campo de valores de la matriz una nueva medida que, para cualquier nivel jerárquico (años, trimestres o meses) devuelva el porcentaje que las ventas para dicho nivel suponen con respecto a las ventas del valor jerárquico superior al que pertenece. Es decir, lo que querríamos es que, para cualquier fila de la matriz en la que se muestre un año, nuestra medida devuelva el porcentaje que las ventas de ese año suponen con respecto a las ventas totales; para las filas que muestren trimestres, que la medida devuelva el porcentaje que las ventas de ese trimestre suponen con respecto a las ventas de ese año; y que para las filas que muestren meses, la medida devuelva el porcentaje que las ventas de ese mes suponen con respecto a las ventas de ese trimestre.

Esto no puede conseguirse con las funciones DAX que hemos visto hasta ahora. Si planteásemos la medida buscada como una división entre las ventas del período actual y las ventas del nivel superior ¿cómo podríamos obtener las ventas de dicho nivel superior? Lo que necesitamos es ser capaces de saber cuál es el nivel jerárquico en el que se va a evaluar nuestra medida para hacer el cálculo correcto en cada caso.

Escribamos ya el cuerpo de nuestra medida:

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

En la variable __currentSales estamos almacenando las ventas del período temporal de que se trate (el período actual, ya sea un mes, un trimestre o un año), en __parentSales almacenamos las ventas del nivel superior del elemento de que se trate (su nivel “padre”) -y, por ahora, damos esta variable el valor 1 a la espera de saber cómo resolver este escenario- y, por último, nuestra medida devuelve el cociente entre las ventas actuales y las del nivel superior. Muy sencillo si averiguamos cómo calcular las ventas del nivel superior.