Función CALCULATE
La función CALCULATE en Lenguaje DAX retorna la evaluación de una expresión escalar en un contexto de evaluación modificado (bien sea contexto de filtro, contexto de fila o contexto visual), este contexto es transformado programablemente mediante filtros explícitos e implícitos, además, de los modificadores. ¡Nota! El contexto de evaluación, independientemente de su tipo, permite que una misma fórmula devuelva valores diferentes, ya que se ejecuta en subconjuntos distintos de filas.
Sintaxis
1 | = 2 | CALCULATE ( Expresion, Filtro1, Filtro2, ... )
Parámetro | Atributo | Descripción |
---|---|---|
Expresión | Obligatorio | La expresión para evaluar en el contexto modificado. |
Filtro | Opcional | FACETA 1: COMO FILTRO Expresión de tabla que representa un filtro, el cual se inyecta como nueva restricción para el contexto. Comúnmente, esta expresión de tabla se indica como una expresión booleana (TRUE/FALSE), no obstante, no es más que un azúcar sintáctico (syntax sugar) para hacer las expresiones de tabla más fáciles de leer.FACETA 1: COMO MODIFICADOR Mediante la ayuda de unas funciones especiales llamadas modificadores, el parámetro ya no actúa como filtro para ser inyectado al contexto, sino que cambia su comportamiento para manipular el modelo de datos, así:• Cambios en la arquitectura de las relaciones mediante: USERELATIONSHIP y/o CROSSFILTER.• Cambios en la estructura original del contexto mediante: (1) ALL, ALLCROSSFILTERED, ALLEXCEPT, ALLNOBLANKROW y REMOVEFILTERS para remover filtros del contexto de filtro, (2) ALLSELECTED para restaurar filtros en el contexto de filtro, y (3) KEEPFILTERS para mantener filtros nativos del contexto de filtro (aunque este último es propiamente un modificador de parámetro -Véase las observaciones-)• Cambios en el nivel del entramado de la tabla virtual: EXPAND y EXPANDALL para subir de nivel, y COLLAPSE y COLLAPSEALL para bajar de nivel. |
Observaciones del Primer Parámetro
Aunque la expresión es el primer parámetro de la función CALCULATE, en realidad es el último en ejecutarse, dado que la modificación del contexto y/o el modelo lo llevan a cabo los parámetros del segundo en adelante.
En el siguiente ejemplo, la suma de la columna ingresos: SUM ( Pedidos[Ingresos] ) es el segundo y último parámetro en calcularse, puesto que, el segundo parámetro: ALL ( Pedidos ) es el primero.
1 | = 2 | CALCULATE ( 3 | SUM ( Pedidos[Ingresos] ) , -- Segundo en ejecutarse 4 | ALL ( Pedidos ) -- Primero en ejecutarse 5 | )
Cualquier función o expresión escalar es válida en el primer parámetro de la función CALCULATE, sin importar el tipo de dato que retorne, siempre y cuando devuelva un valor único.
- Ejemplo 1 – Expresión Sencilla:
1 | #TodasVentas =2 | CALCULATE ( COUNTROWS ( Pedidos ) , ALL ( Pedidos ) )
- Ejemplo 2 – Expresión con más Elementos:
1 | PromedioSemanasDeEntrega =2 | CALCULATE (3 | AVERAGEX (4 | Pedidos,5 | DATEDIFF ( Pedidos[FechaEnvio], Pedidos[FechaLlegada], WEEK )6 | ),7 | Pedidos[SKU] = "CB01"8 | )
Al ser CALCULATE una expresión que retorna un escalar se deduce que se pueden anidar múltiples CALCULATE.
- Ejemplo 3 – Expresión con Anidación de Varios CALCULATE:
1 | IngColombia =2 | CALCULATE (3 | CALCULATE ( [Ingresos Tot] , Pedidos[Pais] = "Colombia" ) ,4 | Pedidos[Pais] = "Argentina"5 | )
El primer parámetro de la función CALCULATE es el único obligatorio. Cuando se utiliza de esta manera se busca añadir filtros implícitos. Esta operación es denominada: Transición de Contextos, la cual se activa siempre que exista un contexto de fila generado en primer lugar.
- Ejemplo:
1 | IngresosDelProducto = -- Expresion para columna calculada2 | CALCULATE ( SUM ( Pedidos[Ingresos] ) )
Un poco acerca de la transición de contextos.
No esta demás resaltar que el comportamiento de la transición de contexto se activa siempre que se genera un contexto de fila en primer lugar, y luego la expresión a ejecutar tenga un CALCULATE, sin importar si sólo se indicó el primer parámetro o tiene más de uno, la clave es que exista un CALCULATE.
Observaciones del Segundo Parámetro (Filtros)
Este parámetro tienes dos facetas.
— FACETA 1: COMO FILTRO
Expresión de tabla que representa un filtro, el cual se inyecta como nueva restricción para el contexto. Comúnmente, esta expresión de tabla se indica como una expresión booleana (TRUE/FALSE), no obstante, no es más que un azúcar sintáctico (syntax sugar) para hacer las expresiones de tabla más fáciles de leer..
— FACETA 2: COMO MODIFCIADOR
Mediante la ayuda de unas funciones especiales llamadas modificadores, el parámetro ya no actúa como filtro para ser inyectado al contexto, sino que cambia su comportamiento para manipular el modelo de datos, así:
Cambios en la arquitectura de las relaciones mediante: USERELATIONSHIP y/o CROSSFILTER.
Cambios en la estructura original del contexto mediante: (1) ALL, ALLCROSSFILTERED, ALLEXCEPT, ALLNOBLANKROW y REMOVEFILTERS para remover filtros del contexto de filtro, (2) ALLSELECTED para restaurar filtros en el contexto de filtro, y (3) KEEPFILTERS para mantener filtros nativos del contexto de filtro (aunque este último es propiamente un modificador de parámetro -Véase las observaciones-).
Cambios en el nivel del entramado de la tabla virtual: EXPAND y EXPANDALL para subir de nivel, y COLLAPSE y COLLAPSEALL para bajar de nivel..
Ejemplos y Detalles en Faceta de Filtro
Si se desea inyectar un filtro adicional al contexto, a menudo se expresa como expresión booleana (TRUE/FALSE), por ejemplo, si desea agregar un filtro para el SKU con nombre CB01, se haría así:.
1 | IngCB01 =2 | CALCULATE ( [Ingresos Tot] , Pedidos[SKU] = "CB01" )
1 | IngCB01 =2 | CALCULATE (3 | [Ingresos Tot],4 | FILTER (5 | ALL ( Pedidos[SKU] ),6 | Pedidos[SKU] = "CB01"7 | )8 | )
La syntax sugar (azúcar sintáctico) no tiene ninguna diferencia entre rendimiento y procesamiento interno, es exactamente lo mismo, sin embargo, es recomendable utilizar la syntax sugar siempre que sea posible sin perder de vista en ningún momento la expresión de tabla (FILTER/ALL) detrás que la compone.
Si se desea inyectar varios filtros al contexto que actúen como una conjunción lógica, dicho de otro modo, como un “y”, cada filtro se debe indicar en su propio parámetro de filtro.
Cuando corresponde a elementos de columnas diferentes, su uso es intuitivo:
1 | IngCB01yColombia =2 | CALCULATE (3 | [Ingresos Tot],4 | Pedidos[SKU] = "CB01",5 | Pedidos[Pais] = "Colombia"6 | )
A razón de lo anterior, se puede deducir que filtros que afecten a la misma columna con un solo elemento, y que, se han implementado en diferentes parámetros de CALCULATE, siempre retornaran vacío
• Ejemplo:
A razón de lo anterior, se puede deducir que filtros que afecten a la misma columna con un solo elemento, y que, se han implementado en diferentes parámetros de CALCULATE, siempre retornaran vacío:
• Ejemplo:
1 | IngVacio =2 | CALCULATE ( [Ingresos Tot] , 3 | Pedidos[SKU] = "CB01" , 4 | Pedidos[SKU] = "CC01" 5 | )
1 | IngCB01-Interseccion =2 | CALCULATE (3 | [Ingresos Tot],4 | Pedidos[SKU] IN { "CB01", "CC01" },5 | Pedidos[SKU] IN { "L07", "CB01" }6 | )7 | -- la interseccion de los elementos de los dos filtros es CB01
La medida IngCB01 es orientada a ilustrar académicamente el comportamiento de la intersección de una manera más visual. Una medida con mayor probabilidad de aplicación con la ayuda de la intersección puede ser como sigue:
1 | IngEntre30y50 =2 | CALCULATE (3 | [Ingresos Tot],4 | Pedidos[Ingresos] >= 30,5 | Pedidos[Ingresos] <= 506 | )7 | -- Especialmente util para desigualdades
La descripción hasta aquí corresponde a cómo interactúan filtros generados por CALCULATE, lo que nos lleva a cómo interactuar los filtros creados por CALCULATE (programables) con los filtros nativos (automáticos):
Se debe tener presente que, si en el contexto de filtro original hay un filtro que afecte a la misma columna por uno inyectado por los parámetros de filtros de CALCULATE, entonces, el de CALCULATE se impone sobre el nativo sobrescribiéndolo. La manera de evitar este comportamiento y hacer que los dos convivan, es utilizando un modificador de parámetro de CALCULATE, particularmente: KEEPFILTERS.
• Ejemplo:
1 | IngCB01 =2 | CALCULATE (3 | [Ingresos Tot],4 | Pedidos[SKU] = "CB01",5 | KEEPFILTERS ( Pedidos[Pais] = "Colombia" )6 | )
Si se desea inyectar un filtro al contexto que actúen como una disyunción lógica, es decir, como un “O”, se debe indicar en un sólo parámetro donde el filtro tenga en sus elementos los valores que constituyen el O.
• Por ejemplo: Una medida que devuelva los ingresos para los productos: CB01, CCO1 y L02; puede ser escrita:.
1 | IngCB01oCC01oL02 = 2 | CALCULATE ( 3 | [Ingresos Tot], 4 | Pedidos[SKU] 5 | IN { 6 | "CB01", 7 | "CC01", 8 | "L02" 9 | }10 | )
La expresión de la medida también puede ser escrita:
1 | IngCB01oCC01oL02 =2 | CALCULATE (3 | [Ingresos Tot],4 | Pedidos[SKU] = "CB01"5 | || Pedidos[SKU] = "CC01"6 | || Pedidos[SKU] = "L02"7 | )8 | -- incluso puede ser escrita con dos OR anidados.
RETORNA ERROR PARA POWER BI ANTES DE MARZO DEL 2021 Y POWER PIVOT.
• Recursos de Aprendizaje
CALCULATE La Reina de las Funciones, Hecho Fácil: Artículo que estudia la función CALCULATE desde una perspectiva de Excel, es un excelente punto de partida sino se conoces de antes esta función del lenguaje DAX, empero, no olvidar que es una explicación aproximada.
» Leer Post
El Contexto de Filtro en Lenguaje DAX: Artículo que hace un estudio meticuloso del contexto de filtro y sus propiedades, puesto que entenderlo implica mejorar la compresión del verdadero objetivo y funcionamiento interno de la función CALCULATE.
» Leer Post
CALCULATE desde el Contexto de Filtro: Seminario donde se estudia CALCULATE desde un punto de vista del funcionamiento interno, es decir, una forma real, para ello se estudia el contexto de filtros y sus propiedades, para partir de allí edificar el conocimiento fundamental en CALCULATE y ver distintas aplicaciones.
» Ver Vídeo
CALCULATE e Implementación de la Relación Punteada: Vídeo que muestra cómo implementar las relaciones punteadas o inactivas para cálculos determinados, utilizando las funciones USERELATIONSHIP y CALCULATE.
Erectile dysfunction can occur because cialis prices reference of poor blood sugar control. 3.
» Ver Vídeo
CALCULATE y Trabajo con Flecha en Ambas Direcciones: Vídeo que muestra cómo alterar el sentido del filtros cruzado, es decir, la flecha de la relación para que quede en ambos sentidos para un cálculo concreto, gracias a las funciones CROSSFILTER y CALCULATE.
» Ver Vídeo
El ABC de la Transición de Contextos: Vídeo que presenta los aspectos fundamentales de la operación de transición de contextos, la cual es la responsable de los filtros implícitos en CALCULATE y CALCULATE tabla debido a la conversión de un contexto de fila a contexto de filtro.
» Ver Vídeo
LO NUEVO en la Reina de las Funciones en DAX: CALCULATE: Vídeo que presenta las últimas novedades en la reina de las funciones en el lenguaje DAX: CALCULATE, que llega gracias a la actualización de marzo del 2021 en Power BI. Es importante estar siempre al día con CALCULATE porque si el lenguaje DAX fuera un juego como ajedrez, entonces, CALCULATE sería la pieza más poderosa, es decir, la reina (dama).
» Ver Vídeo
• Funciones Relacionadas
• Bibliografía
+ Documentación en DAX.Guide »
+ Documentación de Microsoft »
Las cartas y fichas técnicas DAX de Power Elite Studio, LLC. & SAS es un proyecto inspirado en Dax.Guide del equipo de SQLBI y la documentación de Microsoft para el Lenguaje DAX.
★★★★★