CALCULATE. La función más potente de DAX

DAX, el lenguaje en el que se escriben las fórmulas para crear medidas y columnas calculadas en Power BI, es un lenguaje de programación muy variado y versátil. Éste lenguaje de programación pone a nuestra disposición una gran cantidad de funciones para que podamos realizar el análisis de nuestros datos de forma exitosa. Pero no todas estas funciones son iguales, hay algunas más útiles que otras, unas que usaremos más y unas que usaremos menos. Sin duda una de las funciones más útiles y que más usaremos es la función CALCULATE.

Según la guía de Microsoft, CALCULATE evalúa una expresión que es modificada por los filtros especificados. Esto quiere decir que, si por ejemplo, tenemos una expresión para calcular la media de los valores de una columna, podemos controlar si aplicarla a toda la columna o solo a ciertos valores que nos interesen.

Veamos un ejemplo.

En la siguiente tabla tenemos la cantidad de ciertos productos que se han vendido.

Primero, vamos a crear una medida que sume los valores de la columna cantidad.

SUMA = SUM(Productos[Cantidad])

Para ver los resultados de nuestros cálculos creamos una tarjeta en el informe.

El resultado es 38, ya que se han sumado todos los elementos de la tabla. Pero pongamos que queremos sumar solamente los productos de color verde. Entonces usaremos la función CALCULATE.

La función CALCULATE admite un número casi infinito de argumentos, siendo el primero de ellos una expresión a evaluar, como SUM, o una medida que hayamos creado previamente, como SUMA en nuestro caso. A partir del segundo argumento, la función los considera filtros, es decir, el resto de los parámetros de la función serán expresiones que modifiquen la tabla sobre la que se calcula.

Por tanto, si queremos que la suma se realice sólo sobre los productos de color verde, tendremos que realizar un filtro en la columna Producto. Crearemos una nueva medida, en la que usaremos la función CALCULATE para realizar la suma sobre la tabla filtrada.

SUMA_CALCULATE =
CALCULATE(
SUM(Productos[Cantidad]);
Productos[Producto] = “Verde”
)

Que sería lo mismo que escribir:

SUMA_CALCULATE =
CALCULATE(
[SUMA]
Productos[Producto] = “Verde”
)

El resultado de esta medida lo podemos ver en la tarjeta.

La función que hemos escrito también sería equivalente a la siguiente:

SUMA_CALCULATE =
CALCULATE(
[SUMA];
FILTER(ALL(Productos); Productos[Producto] = “Verde”)
)

En el segundo argumento, hemos escrito la función FILTER, una función que devuelve una tabla en la que podemos controlar el contexo filtro, es decir, qué filtros se le aplican, como Producto = “Verde”, o si permitimos que se le apliquen más filtros. Esto último se controla mediante la función ALL, que cancela todos los posibles filtro anteriores que haya sobre una tabla, ya sea mediante una función, o mediante un slicer en un informe. Esto quiere decir que, aunque filtráramos la tabla para quedarnos con los productos de color rojo, la función anularía dicho filtro, para después filtrar por verde. Si no hubiéramos escrito ALL, y hubiera una slicer que filtrara la tabla por productos de color rojo, al filtrar la medida por color verde, no encontraría ningún valor. Vamos a crear una medida para comprobarlo.

SUMA_NO_ALL =
CALCULATE(
[SUMA];
FILTER(Productos; Productos[Producto] = “Verde”)
)

En la vista Informe, añadiremos una tarjeta con esta nueva medida para comparar con la anterior, y un slicer para ver el efecto que tiene sobre las medidas.

Este es el resultado de las dos medidas cuando no se aplica ningún filtro desde el slicer de la izquierda.

Sin embargo, si aplicamos un filtro, la segunda medida no es capaz de calcular la suma de productos verdes, ya que le aplica el filtro del slicer. En la primera, sin embargo, la función ALL evita que se le aplique cualquier filtro previo.

Como se dijo previamente, CALCULATE permite controlar el contexto filtro que aplica a la medida. Es posible controlar qué filtros permitimos que se apliquen y cuáles no. Por ejemplo, podríamos permitir que en nuestra medida se pudiera filtrar por el color del producto, pero no por cualquier otra característica usando la función ALLEXCEPT.

Filtros complejos

La función CALCULATE admite un número casi interminable de argumentos, siendo todos menos uno filtros. Es decir, se puede aplicar más de un filtro en la misma medida. Por ejemplo:

SUMA_CALCULATE =
CALCULATE(
[SUMA];
Productos[Producto] = “Verde”;
Productos[Producto] = “Rojo”
)

Cuando aparecen varios filtros, su combinación puede ser una de las dos siguientes:

    • Conjunción (y)
    • Disyunción (o)

Siguiendo estas dos opciones, la medida anterior podría estar filtrando la tabla por los productos que sean verdes y rojos, que no hay ninguno, o por productos que sean verdes o rojos. La opción correcta es la primera. Cuando se escriben varios filtros de esta manera, son conjunciones lógicas.
Para escribir una disyunción lógica, hay que escribirlos dentro del mismo filtro, y usar el operador lógico ||.

SUMA_CALCULATE =
CALCULATE(
[SUMA];
Productos[Producto] = “Verde” ||Productos[Producto] = “Rojo”
)

De la misma forma podríamos crear una conjunción con el operador &&.

Como se ha visto, las posibilidades de la función CALCULATE son amplísimas, no sólo por la variedad de expresiones que se pueden usar en el primer argumento, si no porque es la única función capaz de controlar el contexto filtro, permitiendo que nuestros cálculos se adapten a nuestras necesidades en cualquier situación.

En los cursos de Power BI básico e intermedio de Bisnia, se desarrollan más en profundidad las características de esta función, además de aplicarla en análisis de datos en casos reales. También se hablará sobre ella en los tutoriales de nuestro canal en Youtube.

¿Te ha sido útil este artículo? Deja tu opinión en los comentarios.

 

También te puede interesar:

DEJA UNA RESPUESTA

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *