Función CALCULATE en DAX – Pt 1: Argumento Expresión.
En este artículo es una nueva serie de 4 artículos enfocados a documentar los cuatro pilares para dominar la función más importante del lenguaje DAX: CALCULATE, de hecho, los cuatro rubros son: Argumentos de Filtros, Transición de Contextos, Modificadores de CALCULATE y Orden de Precedencia.
— TABLA DE CONTENIDO DE ESTE ARTÍCULO
1. Generalidades de la Función CALCULATE
a. Descripción
b. Sintaxis
2. Argumento Expresión
a. Consideración No.1: Orden de Ejecución
b. Consideración No.2: Cualquier Expresión Escalar
c. Consideración No.3: Transición de Contextos
Antes de iniciar de te voy a decir un par de cosas:
En primer lugar, esta serie de artículos esta creado a partir de la ficha técnica de la Carta DAX de CALCULATE: Mago de la Modificación de Contextos.
Por lo que te recomiendo que la descargues y las tengas a la mano siempre si eres una persona que trabaja frecuentemente con DAX, es más imprímela.
DESCARGAR CARTAS DAX:
CALCULATE MAGO DE LA MODIFICACIÓN DE CONTEXTOS
Adicional a la ficha técnica, vas a encontrar la carta DAX propiamente, es decir, el personaje que representa esta función para el juego que estamos diseñando poco a poco.
En segundo lugar, estos artículos aportan mucha luz si tienes un bagaje previo sobre el lenguaje DAX, contexto de evaluación, así como un estudio de la función CALCULATE, en resumidas cuentas, estos manuscritos no son para ti si arrancas desde cero en DAX y CALCULATE, si es verdad, que te pueden dar una idea con meridiana claridad, a pesar de ello, muchas cosas te sonarán a marciano C2 y el impacto de diversas implicaciones pasarán desapercibidas.
Si quieres un estudio desde cero, profundo, detallado y altísimo impacto en CALCULATE te recomiendo que hagas nuestro:
Énfasis en CALCULATE y CALCULATETABLE
Una capacitación OnLine y 100% en vivo de 6 horas, donde la apabullante complejidad de CALCULATE la simplificamos a 4 pilares sencillos.
Sus ediciones ocurren esporádicamente para brindar una experiencia lo más personalizada posible, vista la web y lee lo que dicen nuestros antiguos participantes [Visitar Web del Énfasis en CALCULATE].
Generalidades de la Función CALCULATE
Descripción
La función CALCULATE retorna la evaluación de una expresión escalar en un contexto modificado, este contexto es transformado programablemente por filtros y modificadores.
Esta función esta tan importante en DAX porque es la única que tiene dicha habilidad: modificar el contexto, bueno también la función CALCULATETABLE y SUMMARIZECOLUMNS y algunas otras que al final son alias de las ya mencionadas tienen esta habilidad, no obstante, al ser CALCULATE la única escalar su espectro de aplicaciones supera con creces la suma de las otras dos, es por ello, que se encuentra desde los anales del lenguaje DAX, así:
• Microsoft Excel ≥ 2010
• Power BI Desktop ≥ Nov 2016
• SSAS ≥ 2012
La función CALCULATE recibe un número indeterminado de argumentos, aunque rara vez a modo personal utiliza más de 7, he aquí su sintaxis:
Sintaxis
Ejemplo de con argumentos
IngresosDetalle :=
CALCULATE (
[Ing];
Pedidos[País] = «Colombia»;
Pedidos[Ciudad] = «Medellín»;
Pedidos[SKU] = «CB01»;
Pedidos[Unidades] = 1;
Pedidos[TipoCompra] = «Normal»
)
Recordemos: Parámetro = Argumento.
En este primer artículo veremos los detalles del primer argumento: argumento expresión, para en el segundo artículo ver los detalles del segundo argumento en adelante en su primera faceta: como filtro, por lo que el tercero, será sobre su tercera faceta: como modificador, para finalmente terminar con algunos detalles como orden de precedencia.
Argumento Expresión
(1) Expresión: La expresión para evaluar en el contexto modificado, debe ser una expresión escalar y puede ser de cualquier tipo: BINARY, BOOLEAN, CURRENCY, DATATIME, DECIMAL, INTEGER, STRING o VARIANT.
• Tipo: Obligatorio
• Atributo: No Repetible
El primer argumento de la función CALCULATE por si sólo es muy poderoso, además, tiene varias consideraciones que deben ser entendidas si se quiere dominar esta función.
Consideración No. 1: Orden de Ejecución
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.
IngresoTotal :=
CALCULATE (
— Segundo en ejecutarse
SUM ( Pedidos[Ingresos] );
— Primero en ejecutarse
ALL ( Pedidos )
)
Lo anterior va a suceder siempre, no importa que CALCULATE tenga dos, tres o más argumentos, el argumento expresión siempre será el último.
En el siguiente ejemplo, el segundo parámetro: REMOVEFILTERS ( Pedidos ) es el primero en ejecutarse, después, el tercer parámetro: VALUES ( Pedidos[País] ) es el segundo en ejecutarse, y, finalmente el primer parámetro: SUM ( Pedidos[Ingresos] ) es el último en ejecutarse:
Véase la expresión DAX:
IngresoTodosLosProductos :=
CALCULATE (
— Tercero en ejecutarse
SUM ( Pedidos[Ingresos] );
–Primero en ejecutarse
REMOVEFILTERS ( Pedidos );
–Segundo en ejecutarse
VALUES ( Pedidos[País] )
)
Consideración No. 2: Cualquier Expresión Escalar
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, BINARY, BOOLEAN, CURRENCY, DATATIME, DECIMAL, INTEGER, STRING o VARIANT. Siempre y cuando devuelva un valor único, será 100% legítimo.
• Ejemplo 1 – Expresión Sencilla:
VentasTotales :=
CALCULATE ( COUNTROWS ( Pedidos ); ALL ( Pedidos ) )
• Ejemplo 2 – Expresión con Más Elementos:
PromedioSemanasDeEntrega :=
CALCULATE (
AVERAGEX (
Pedidos;
DATEDIFF ( Pedidos[FechaEnvio]; Pedidos[FechaLlegada]; WEEK )
);
Pedidos[SKU] = «CB01»
)
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
IngColombia :=
CALCULATE (
CALCULATE ( [IngTot]; Pedidos[País] = «Colombia» );
Pedidos[País] = «Perú»
)
«!»: Se debe prestar especial atención al orden de ejecución de los CALCULATE, como se mencionó en la observación I: El primer parámetro es el último en ejecutarse, por lo tanto, la medida anterior retorna los ingresos para Colombia y no para Perú como se puede pensar en un primer momento
Consideración No. 3: Único Obligatorio (Transición de Contextos)
El primer parámetro de la función CALCULATE es el único obligatorio. Cuando se utiliza de esta manera se busca poder activar la operación de transición de contextos cuando exista un contexto de fila generado en primer lugar
• Ejemplo 1 – Columna Calculada
IngresosxProducto =
— Expresión para columna calculada
CALCULATE ( SUM ( Pedidos[Ingresos] ) )
Un poco acerca de la transición de contextos.
TRANSICIÓN DE CONTEXTOS
La transición de contexto consiste en mover un contexto de fila a un contexto de filtro, mediante dos operaciones: (1) invalidando cualquier contexto de fila existente, y luego, (2) agregando como argumentos de filtros ocultos (nostros los denominamos argumentos fantasma) todas las columnas y sus valores en la iteración actual.
Por lo anterior, debe generarse un contexto de fila automático o programable previamente.La transición de contexto busca añadir la restricción de una fila para que afecte a otra tabla.
Existen 6 consideraciones imprescindibles de la transición de contextos
.
- Invalida cualquier contexto de fila
- Agrega argumentos de filtro ocultos (fantasma)
- No hay garantía de filtrar una fila individual
- Es una operación de alto costo
- Los argumentos de filtros son de columnas nativas y calculadas
- Creación de contexto de filtro a partir de un contexto de fila
.
Para Aprender Más: Énfasis en CALCULATE → Suscripción a List de Espera para la próxima Eidción (6 horas de CALCULATE OnLine y en Vivio)
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.
De lo anterior hay que recalar que: No siempre que exista un contexto de fila y un CALCULATE se va activar la transición de contexto, puesto que debe darse en orden:
1: Generación de un Contexto de Fila (Automático o Programable)
2: Existencia de un CALCULATE
Y debe ser en ese orden, primero la generación de un contexto de fila y luego la ejecución o aparición de un CALCULATE, si el orden esta invertido, es decir, primero aparece un CALCUATE y luego se genera un contexto de fila, entonces, no se activa la transición de contextos.
• Ejemplo – No Activa Transición de Contextos
Ingresos2015 :=
CALCULATE (
[Ingresos Tot];
FILTER ( ALL ( Calendario[Año] ); Calendario[Año] = 2015 )
)
Sin embargo, el siguiente ejemplo si respta el orden y ejecuta la transición de contextos
• Ejemplo – Activación de Transición de Contextos
UltimoBalance :=
SUMX (
VALUES ( Balance[Nombre] );
CALCULATE (
SUM ( Balance[Balance] );
LASTNONBLANK ( Calendario[Fecha]; COUNTROWS ( RELATEDTABLE ( Balances ) ) )
)
)
CALCULATE IMPLÍCITO
Hay un comportamiento especial del lenguaje DAX que vale la pena resaltar siempre que sea posible:
Cada vez que se hace referencia a una medida no importa si es desde otra medida, desde una columna calculada o desde una medida creada localmente para consultas en la sección DEFINE de EVALUATE, la expresión interna queda encerrada en un CALCULALTE.
IngTot :=
— Si primero se crea/define la siguiente medida:
SUM ( Pedidos[Ingresos] )
Luego es llamada en algún cálculo DAX, ejemplo:
IngresosDelProducto := [Ing]
— Si primero se crea/define la siguiente medida:
Entonces la expresión interna queda:
IngresosDelProducto :=
— Al expandir la medida referenciada
CALCULATE ( SUM ( Pedidos[Ingresos] ) )
Por este CALCULATE implícito es tan importante la convención para distinguir siempre cuando se hace referencia a una medida y a una columna de una tabla, indicando una medida sin la tabla donde reside, así: [IngTot] y una columna siempre indicando la columna donde reside, así: Pedidos[Ingresos], para ser consientes en todo momento de una medida, de tal manera que si se genera un contexto de fila previo podamos notar la transición de contextos.
Bueno eso est todo de mi parte mil gracias por leerme, nos vemos en la segunda entrega de CALCULATE
– Miguel