Si te enfrentas de primeras con DAX, la transición de contexto te puede resultar difícil de entender. Para ello, es muy recomendable, no, mejor dicho, es imprescindible conocer y entender el contexto de fila y filtro. Si no lo tienes claro, te recomiendo que leas primero mi post sobre los contextos de fila y filtro.


La transición de contexto, es desencadenada por la función CALCULATE (o CALCULATETABLE). La transición de contexto, es la transformación de un contexto de fila en uno de filtro equivalente para ser utilizado por la función CALCULATE (o CALCULATETABLE).


¿Qué sintaxis tiene CALCULATE?



CALCULATE(<expression>[, <filter1> [, <filter2> [, …]]])


El primer argumento es la expresión que puede ser una métrica o un cálculo que definamos in situ que vamos a operar y después de esa primera expresión vienen N argumentos, cada argumento sería un filtro, que el nombre que no os confunda con la función FILTER ¿de acuerdo?


Vamos a ir adentrándonos poco a poco con ejemplos para ir entendiéndolo. Disponemos de la siguiente métrica:

 



La expresión de arriba, nos cuenta el número de filas totales de la tabla DimCustomer. Si sacamos una matriz como objeto visual, arrastramos como filas el género de la tabla DimCustomer y la medida como valores. 





¿Qué estamos haciendo aquí? Estamos contando las filas de la tabla DimCustomer. Tengo un total de 18484 filas de las cuales 9133 son mujeres (Female) y 9351 son hombres (Male).


Ahora generamos la siguiente medida y la arrastramos también a la matriz:

 

 

 

 


 

 


En la segunda medida, la de mujeres (Female) fijaros que tanto para el contexto de fila de mujeres como para hombre me devuelve el resultado de las mujeres 9133.


¿Cómo? ¿Por arte de magia? No, mediante la potencia o la habilidad de CALCULATE de reescribir ese contexto de filtro. ¿Qué es lo que está haciendo CALCULATE? Tengo esa expresión que yo quiero calcular, qué es la misma que la de arriba, pero le paso un primer argumento de filtro qué es que el sexo de los clientes sea femenino DimCustomer [Gender] = "F".


Pero en la fila de la matriz, el género es M (Male):

 

 

 



Pero CALCULATE le dice "nono", me devuelves el femenino. ¿Se ve el ejemplo? ¿Tendría sentido esto hacerlo en un proyecto real? Seguramente no pero a modo ilustrativo creo que es válido. ¿Veis como es capaz de rescribir el contexto de filtro y como me devuelve el conteo de las mujeres en lugar de los hombres, aunque el valor de la celda sea hombres?


La sintaxis que hemos visto, es la versión standard del CALCULATE. Vamos a ver la siguiente:

 


 


Esta sintaxis es equivalente a la estándar del CALCULATE.

 

 

 

 

 



¿Qué hace exactamente? Cuéntame el número de filas de la tabla Clientes y como argumento de filtro invoco a la función FILTER qué hace un ALL sobre la columna de sexo de los clientes, es decir, eliminaría los filtros y establecería un filtro que el sexo sea femenino (F). Eso es lo que explica que, aunque en la matriz ponga masculino no haga caso de ese filtro, lo ignore y pueda cambiarlo al sexo femenino.

Hasta ahora sólo hemos visto CALCULATE con un único argumento. En la imagen siguiente tenemos dos argumentos.

 


 

 

¿Qué resultado pensáis que me devuelve esta medida? Resultado es un valor BLANK() ¿Por qué? Las condiciones del CALCULATE se combinan con un AND lógico. ¿Esto qué quiere decir? Le estoy diciendo con esta sentencia donde las filas de cliente el sexo sea Femenino y Masculino a la vez… Al no encontrar valores devuelve BLANK()

 

 



 

 

Vamos a ver el orden de evaluación de la función CALCULATE con diferentes ejemplos que nos van a ayudar a comprender mejor o eso espero las transiciones de contexto.

 


 

 


Aquellas personas que tengan dos hijos y sean mujeres. Aunque sabemos…¿En qué orden se está evaluando? Vamos a ver otro ejemplo:

 


 

 

¿Qué me devuelve esta métrica? La respuesta correcta es que me devuelve el número de mujeres.

 


 

 

Fijaros, tengo dos CALCULATE. La expresión sería lo comprendido en el segundo CALCULATE y el argumento de filtro la segunda parte. Yo aplico el parámetro de filtro y después computo la expresión que para este ejemplo es otra expresión.

 

 

 

 


Veámoslo paso a paso. Primer paso aplico este filtro:



 

 

 

Como segundo paso de evaluación, trato la expresión, que es el segundo CALCULATE:

 



 

 



 

Como tercer paso. Aplico el argumento de filtro que al ser un filtro sobre la columna de sexo sobrescribe cualquier filtro que hay sobre la columna.

 

 

  

 

 

¿Bien hasta ahora? Sigamos analizando las transiciones de contexto con otro ejemplo. ¿Qué nos devuelve la siguiente expresión?

 

  



El resultado es BLANK. Vamos a analizar el por qué:

 


 

 



Lo primero que se ejecuta es el primer filtro del primer CALCULATE:

 


 

 




Como segundo paso, evalúo la expresión que es el otro CALCULATE.

 


 

 


Le decimos filtra la tabla de clientes que tengan en la columna sexo igual a Femenino. Y eso me lo cuentas.

 

 

 

 
¿Por qué da blanco? Pues muy sencillo, de la tabla de clientes reescribo el filtro y le digo que sea masculino. Como segunda expresión, otro CALCULATE. Sobre la tabla de cliente, le decimos que se quede con las que tiene sexo femenino pero la tabla de clientes solo tiene las filas del sexo masculino por ese argumento de filtro de fuera. Por eso al contar las personas en femenino, como está filtrada por el sexo masculino no encuentra ningún registro.


En resumen, las transiciones de contexto no son complejas en sí, pero pueden complicarse mucho ya que puede que sea difícil de seguir el flujo del contexto. Espero que con este pequeño post, te ayude a comprender mejor las transiciones de contexto.



¡Nos vemos en los datos!