Contexto de fila y contexto de filtro son dos conceptos o partes de la evaluación de contexto con DAX que tienen diferente conductas. Existen funciones que pueden hacer uso de uno de ellos o de ambos y a su vez tenemos funciones de DAX como CALCULATE y CALCULATETABLE que pueden generar interacciones entre estos dos conceptos.
Row Context (Contexto de Fila) y CALCULATE
Al usar la función CALCULATE en una expresión evaluada dentro del contexto de fila, ese contexto de fila se transforma en un contexto de filtro (Filter Context) para las filas equivalentes. Como regla general el filter context se aplica a una fila en concreto, pero si la tabla no tiene una columna clave o tiene filas duplicadas, el filter context contiene todas y cada una de las filas implicadas duplicadas en el row context inicial.
Este concepto es muy importante que se aplica en todas las fórmulas DAX, para demostrar su funcionamiento vamos a poner un ejemplo. Consideramos la suma SumMinPrice, columna calculada:
SumMinPrice = SUM(Segments_Datatable[Min Price])
Esta operación, como se puede ver genera el mismo resultado para todos los elementos de la tabla. Si esta operación se embebe dentro de una operación de cálculo CALCULATE, el resultado es totalmente distinto.
La operación retorna el mismo resultado que MinPrice.
Igual que se explicó en el anterior artículo, el filter context (Contexto de Fila) se propaga a través de las relaciones entre tablas por cada una de las filas del Row Context. Por lo tanto, se puede obtener el mismo resultado utilizando las funciones RELATED y RELATEDTABLE que con CALCULATE y CALCULATETABLE, es decir, las siguientes operaciones retornan el mismo resultado.
OrdersDiscount = RELATED(Channel[Discount])
OrdersDiscount = CALCULATE(VALUES(Channel[Discount]))
Las dos operaciones anteriores retornan el mismo resultado para la columna Discount de la tabla Channel. Ambas utilizan la relación creada entre la tabla Orders y la tabla Channel.
Nota Importante:
La función VALUES, de la misma forma que la función DISTINCT, normalmente devuelve un conjunto de valores. Si esta lista de valores está formada por un único valor, VALUES y DISTINCT se pueden utilizar como funciones escalares. Si la función se aplica sobre una tabla maestra o una tabla de lookup y el row context o contexto de fila se encuentra en la tabla muchos, esta función no retorna nunca más de un valor. Si retorna más de un valor, significa que la relación está rota o tiene una referencia equivocada, en esta caso se retorna un error y la expresión falla. Hay que tener en cuenta que la función RELATED comprueba que existe una relación entre las tablas implicadas en la expresión mientras que CALCULATE no comprueba esta relación a nivel de metadata, por lo tanto, no nos mostrará un warning y no sabremos el motivo por el que la expresión no funciona.
Por otra parte, se puede utilizar la función CALCULATETABLE en lugar de RELATEDTABLE para columnas calculadas de la tabla Channels, tabla maestra que se relaciona con la tabla Orders de nuestro modelo.