Documente Academic
Documente Profesional
Documente Cultură
Función
7n EE
Descripción
CALCULATE La función CALCULATE retorna la evaluación de una expresión escalar en un contexto
modificado, este contexto es transformado programablemente mediante filtros y
Compatibilidad modificadores.
Microsoft Excel
Excel ≥ 2010 Sintaxis
★★★★★
Power BI Desktop
PBI ≥ Nov 2016 1 Primer Parámetro Segundo Parámetro (Opcional) 2
★★★★★
SQL Analysis Services CALCULATE ( < Expresión > ; [ <Filtro_1 > ] ; [ <Filtro_2> ] ; … )
SSAS ≥ 2012
Contexto de Filtro
Lo Tiene en Cuenta (Al Principio) Luego
Modifica el Contexto de Filtro
1 Expresión Tipo
★★★★★ La expresión para evaluar en el contexto Obligatorio
Contexto de Fila modificado. Atributo
Lo Tiene en Cuenta (Al Principio) Luego Expresión Escalar de Cualquier Tipo
Invalida Contextos de Fila
No Repetible
Categorías Observaciones
Según Comportamiento (RC)
Activo (ON/OFF) I. 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
Según Resultado y/o el modelo lo llevan a cabo los parámetros del segundo en adelante.
Escalar
1. IngColombia :=
2. CALCULATE (
3. CALCULATE ( [IngTot]; Pedidos[País] = "Colombia" );
4. Pedidos[País] = "Perú"
5. )
Otros Recursos de III. El primer parámetro de la función CALCULATE es el único obligatorio. Cuando
Aprendizaje 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:
CALCULATE1 IMPLICITO
Iniciación a CALCULATE – Máster en DAX Por este CALCULATE implícito es tan importante la convención para
distinguir siempre cuando se hace referencia a una medida y a una
El siguiente vídeo pertenece al curso Máster columna de una tabla, indicando una medida sin la tabla donde reside,
en DAX y Power Pivot. así: [IngTot] y una columna siempre indicando la columna donde reside,
→ http://bit.ly/31513Cj ←
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.
Observaciones
1. IngCB01 :=
2. CALCULATE ( [IngTot] ; Pedidos[SKU] = "CB01" )
1. IngCB01 :=
2. CALCULATE ( [IngTot];
3. FILTER ( ALL ( Pedidos[SKU] );
4. Pedidos[SKU] = "CB01" )
5. )
Nota Sobre Syntax Sugar La syntax sugar (azúcar sintáctico) no tiene ninguna diferencia entre
El orden en el azúcar sintáctico es permutable, rendimiento y procesamiento interno, es exactamente lo mismo, sin
con lo cual Pedidos[SKU]="CB01" es igual
que "CB01"= Pedidos[SKU].
embargo, es recomendable utilizar la syntax sugar siempre que sea posible
sin perder de vista en ningún momento la expresión tabular detrás que la
compone.
Inyectar Varios Filtros
(Actúan como un Y) II. 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.
• Ejemplo:
1. IngCB01 :=
2. CALCULATE ( [IngTot];
3. Pedidos[SKU] = "CB01";
4. Pedidos[País] = "Colombia"
5. )
• Ejemplo:
1. IngVacío :=
2. CALCULATE ( [IngTot];
3. Pedidos[SKU] = "CB01";
4. Pedidos[SKU] = "CC01"
5. )
No se debe asumir siempre que varios argumentos de filtros que afecten a la misma columna
van a retornar vacío, debido a que la operación que se realiza entre ellos es la intersección
de sus elementos antes de la aplicación al modelo, por lo tanto, si comparten elementos si
devuelven algún valor.
• Ejemplo:
1. IngCB01 :=
2. CALCULATE ( [IngTot];
3. Pedidos[SKU] IN {"CB01"; "CC01"};
4. Pedidos[SKU] IN {"L07"; "CB01"} )
5. -- la intersección de los elementos de los dos filtros es CB01
• Ejemplo:
1. IngEntre30y50 :=
NOTA CALCULATE ( [IngTot];
2.
3. Pedidos[Ingresos] >= 30;
4. Pedidos[Ingresos] <= 50
5. ) -- Especialmente útil para desigualdades
Inyectar un Filtro con III. Si se desea inyectar un filtro al contexto que actúen como una disyunción
Varios Elementos lógica, dicho de otro modo, como un “O”, se debe indicar en un sólo
(Actúan como un O) 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:
• Ejemplo:
1. IngCB01oCC01oL02 :=
2. CALCULATE ( [IngTot] ; Pedidos[SKU] IN {"CB01"; "CC01"; "L02" } )
1. IngCB01oCC01oL02 :=
2. CALCULATE (
3. [IngTot];
4. Pedidos[SKU] = "CB01"
5. || Pedidos[SKU] = "CC01"
6. || Pedidos[SKU] = "L02"
7. ) -- incluso puede ser escrita con dos OR anidados.
1. IngCB01oColombia :=
2. CALCULATE ( [IngTot];
O de Columnas 3. Pedidos[SKU] = "CB01"
Diferentes 4. || Pedidos[País] = "Colombia"
5. ) -- Esta expresión no es válida: ERROR!
En este caso, la expresión tabular debe ser redactada de forma explícita, una
posibilidad puede ser:
1. IngCB01oColombia :=
Opción No. 1: 2. CALCULATE ( [IngTot];
PELIGORSA 3. FILTER ( Pedidos ; Pedidos[SKU] = "CB01"
4. || Pedidos[País] = "Colombia" )
5. ) -- Esta expresión es válida: pero NO RECOMENDABLE.
• Ejemplo:
1. IngCB01oColSMZ :=
2. CALCULATE (
3. [Ing];
4. FILTER (
5. SUMMARIZE ( Pedidos; Pedidos[Pais];
6. SKUProductos[NombreProducto] );
7. Pedidos[Pais] = "Colombia"
8. || SKUProductos[NombreProducto] = "Batman Begins"
9. )
10. )
11. -- Cardinalidad menor al producto cartesiano, pero se escanea la tabla
12. -- completa en busca de las combinaciones, lo cual es
13. -- contraproducente para el rendimiento cuando las columnas tienen
14. -- baja cardinalidad y la tabla es de un número de registros alto.
• Ejemplo:
1. IngLleg :=
2. CALCULATE (
3. [IngTot];
4. USERELATIONSHIP ( Pedidos[FechaLlegada]; Calendario[Fecha] )
5. )
6. -- En la función USERELATIONSHIP primero se indica la clave externa
7. -- Y en el segundo parámetro la clave primaria.
• Ejemplo:
1. PrDtsVend :=
2. CALCULATE (
3. COUNTROWS ( SKUProductos );
4. CROSSFILTER ( Pedidos[SKU]; Productos[SKU]; BOTH )
5. ) -- Opción preferible siempre que sea posible.
• Ejemplo:
1. %Particiacion :=
2. VAR Numerador =
3. SUM ( Pedidos[Ingresos] )
4. VAR Denominador =
5. CALCULATE ( SUM ( Pedidos[Ingresos] ); ALL ( Pedidos ) )
6. VAR PctParticipacion =
7. DIVIDE ( Numerador; Denominador )
8. RETURN
9. PctParticipacion
1. %PartVisible :=
2. DIVIDE ( [IngTot]; CALCULATE ( [IngTot]; ALLSELECTED () ) )
OBSERVACIONES
1. IngresosDeAltaRentabilidadxProducto :=
2. CALCULATE ( [IngTot] ;
3. Pedidos[Ingresos] > [Ing] * 0,8 ) -- Error!
1. IngresosDeAltaRentabilidadxProducto :=
2. CALCULATE (
3. SUM ( Pedidos[Ingresos] );
4. FILTER ( ALL ( Pedidos[Ingresos] ); Pedidos[Ingresos] > [Ing] * 0,8 ) )
VII. Si dos filtros afectan a la misma columna, pero son generados por un mismo
contexto de filtro, entonces, la intersección de sus elementos ocurre sin la
necesidad de KEEPFILTERS, por ejemplo, al ser creados por distintos
parámetros de filtros en un mismo CALCULATE, como es el caso de:
1. IngCB01 :=
2. CALCULATE ( [IngTot];
3. Pedidos[SKU] IN {"CB01"; "CC01"};
4. Pedidos[SKU] IN {"L07"; "CB01"}" )
5. -- la intersección de los elementos de los dos filtros es CB01.
Nótese que los dos filtros afectan a la misma columna y son generados por
un mismo CALCULATE (un mismo contexto), es por ello que se realiza la
intersección de sus elementos antes de ser aplicado al modelo de datos,
situación diferente si el filtro existe previamente por el reporte (contexto
de filtro original) y luego llega uno de CALCULATE (contexto de filtro copia)
que afecta a la misma columna (generados por contextos diferentes).
b. Un filtro vacío indica que para esa columna no hay ningún elemento
visible, por lo que la tabla en cuestión y todas las relacionadas
mediante el tipo 1 → * quedan completamente vacías, por lo
tanto, una medida de alguna de esas tablas devolvería BLANK.
ORDEN DE PRECEDENCIA1
i. Todos los parámetros de filtros explícitos son preparados individualmente en el contexto de evaluación original,
es decir, contexto de filtro original y contextos de fila si existen.
Aquí los filtros son preparados más no inyectados al contexto de filtro, esto quiere decir que no se aplican al modelo de datos aún, tan sólo se
construyeron respetando el contexto de evaluación original, por eso se dice que los filtros quedan latentes.
ii. Se crea una copia del contexto de filtro original, sin ningún contexto de fila porque son invalidados.
iii. Se ejecuta la operación de transición de contextos si previamente se ha generado un contexto de fila bien sea
automático o programable, con lo cual, todos las columnas actuales y sus valores son creados como parámetros
de filtros implícitos e inyectados a la copia del contexto de filtro.
Es posible evitar la imposición de sobreescritura de filtros añadidos por transición de contextos (argumentos implícitos o fantasmas), encerrando
la expresión tabular donde se itera con KEEPFILTERS (especialmente útil para mantener la forma de filtro arbitrario)
iv. Se ejecutan los parámetros que actúen como modificadores de CALCULATE: USERELATIONSHIP, CROSSFILTER; ALL,
ALLEXCEPT, ALLNOBLANK, ALLCROSSFILTER, REMOVEFILTERS y ALLSELECETED.
Gracias a este orden, se puede anular la transición de contextos con cualquier función ALLxxxx. (Especialmente útil para columnas calculadas)
v. CALCULATE inyecta todos los parámetros de filtros explícitos a la copia del contexto del filtro, haciendo que
convivan e intersequen aquellos que afecten la misma columna y vayan encerrados en KEEPFILTERS.
vi. Se aplican todos los filtros del nuevo y más reciente contexto de filtro a el modelo de datos: a todas las tablas
que corresponda, generando un nuevo subconjunto de datos visibles (contexto de evaluación).
vii. Se ejecuta el primer parámetro: Expresión escalar, en el nuevo y más reciente contexto de evaluación.
viii. Una vez finalizado el más reciente contexto de filtro es descartado regresando al contexto original.
Por ejemplo:
→ http://bit.ly/32BXeqe ←
→ www.CartasDax.Com ←
Funciones Relacionadas:
CALCULATETABLE