CALCULATE, junto con la función CALCULATETABLE, es la única función que puede modificar el contexto de filtro (filter context).  Esta función crea un nuevo filter context y evalua la expresión en función del nuevo contexto de fila. Por lo tanto, podemos decir que esta función modifica el contexto de evaluación.

[Measure] := CALCULATE (expresion,Condición 1,Condición 2,Condición 3,..-, Condición N )

CALCULATE acepta cualquier número de parámetros, siendo el primero el único obligatorio, es cual es una expresión a evaluar. La forma en la que trabaja la función CALCULATE es la siguiente:

  • Hace una copia del actual filter context y lo copia en un nuevo filter context.
  • Evalúa todos los filtros puestos en las condiciones y calcula la lista de valores específicos para cada columna del filtro.
  • Si dos o más filtros afectan a la misma columna, aplica estos haciendo MERGE con el operador AND, es decir, una intersección.
  • Usa la condición nueva para reemplazar los filtros de las columnas del modelo. Si una columna tiene un filtro, el nuevo filtro de la fórmula, reemplaza el filtro existente. Si las columnas no tienen filtro, el filtro de las condiciones se aplica a la columna.
  • Evaluado el filtro de contexto, CALCULATE compute la expresión en función del nuevo filter context. Al final, retornará el filtro de contexto original, devolviendo el resultado.

EJEMPLOS CON LA FUNCIÓN CALCULATE

Teniendo en mente lo que hemos aprendido sobre la función CALCULATE, vamos a plantear, ejemplos, de más básicos a más complicados para fijar los conocimientos que hemos aprendido. La complejidad e importancia de la función viene del hecho de que usando la función puedes pensar en un sólo contexto de filtro y terminar aplicando varios contexto de filtro en la misma fórmula, lo cual hace que el flojo del código sea muy difícil de seguir. De acuerdo a la experiencia que tengo en este campo, la mejor forma de fijar conceptos sobre el contexto de filtro en la función CALCULATE, es haciendo ejemplos de más simples más complicados.

Filtro en una columna

Lo más sencillo que se puede hacer con la función CALCULATE es filtrar una única columna. Por ejemplo, imagina que quieres crear una medida que retorna siempre las ventas de un producto de color negro, las fórmula será de la siguiente forma:

[Sales Amount Black Product] :=
                      CALCULATE ( SUM ( Sales[SalesAmount] ); Product[Color] = «Black» )

Este es el resultado de aplicar la fórmula.

DAX transforma la expresión en la siguiente:

[Sales Amount Black Products] :=
CALCULATE (
    SUM ( Sales[SalesAmount] ),
    FILTER ( ALL ( Product[Color] ), Product[Color] = «Black» )
)

Por esta razón, sólo se puede referenciar una columna en la parte del filtro argumento de la función CALCULATE , DAX tiene que detectar la columna para iterar a través de la función FILTER, todo esto se hace automáticamente en Background. Si quieres poner más de una columna en la parte de los argumentos del filtro, tienes que escribir explicitamente la función FILTER en los argumentos, como veremos en otros artículos.