Guía de Introducción a Cálculos Visuales en DAX: Desde Creación Paso a Paso, Hasta una Profundización el Concepto de Eje.
Dominar el Lenguaje DAX no es tarea sencilla; en otras palabras, la curva de aprendizaje se presenta como una montaña empinada para muchos. Lo afirmo con certeza, ya que he estado enseñando esta temática desde el año 2015 y he observado repetidamente que a las personas les resulta desafiante, es aquí donde llegan los Cálculos Visuales en DAX a zanjar el problema.
¿Por qué el Lenguaje DAX es difícil?
Antes de sumergirnos en los Cálculos Visuales en DAX en el lenguaje homónimo, permítanme hacer unas observaciones puntuales sobre la complejidad de aprender DAX.
A primera vista, el lenguaje puede parecer extremadamente accesible; sin embargo, conforme nos adentramos, emergen una serie de detalles que incrementan su complejidad. Aunque no me extenderé en los múltiples aspectos que hacen de DAX un lenguaje desafiante (pueden encontrar un análisis detallado en el artículo y video del equipo de SQLBI aquí), sin embargo, sí deseo destacar un elemento particularmente intrincado que está directamente relacionado con los Cálculos Visuales.
Cálculos DAX desde el modelo
A diferencia de los cálculos DAX convencionales, como las Columnas Calculadas, Tablas Calculadas, Medidas y Grupos de Cálculos, que se posicionan al inicio de la cadena de procesamiento de datos, los Cálculos Visuales en DAX ocuparán un lugar único al final de la cadena de procesamiento de datos. Se sitúan justo después de la agregación de los datos y antes de que la visualización se proyecte en pantalla.

Al examinar la imagen previa, obtenemos una visión clara de cómo se llevan a cabo los Cálculos DAX, incluyendo las Columnas Calculadas, Medidas, Tablas Calculadas y Grupos de Cálculo, dentro del modelo semántico. Para que estos cálculos se ajusten a lo solicitado, es necesario modificar los datos visibles en el modelo, lo cual se consigue a través de elementos clave como el Contexto de fila y el Contexto de filtro, además de la transformación del primero en el segundo (transición de contexto). No obstante, es importante destacar que estos detalles, aunque cruciales, no son visibles directamente en el modelo en Power BI. A pesar de la posibilidad de acceder a la vista de datos, la transformación operada por los contextos permanece oculta, lo que a menudo puede llevar a pasar por alto su impacto.
Esta “sutileza” y la falta de visibilidad directa de estos procesos subyacentes añaden una capa significativa de complejidad al lenguaje DAX.

Cálculos DAX desde lo visual
En este punto, los Cálculos Visuales DAX emergen como un cambio de paradigma revolucionario en el manejo del Lenguaje DAX. Su ejecución ocurre directamente en el ámbito visual de los informes, donde todo lo demás ya ha sido agregado y el manejo de contextos se ha realizado por nosotros. En términos técnicos, se podría decir que estos cálculos abstraen estos conceptos, al menos en el ámbito de su ejecución.
La imagen que sigue ilustra esta nueva perspectiva en el manejo de Cálculos DAX: centrada en la visualización de informes, en lo que es inmediatamente perceptible. En otras palabras, se sitúan al final de la cadena de procesamiento de datos, justo cuando todo está agregado y antes de proyectarse en pantalla. Esta ubicación final en el proceso no solo es un reflejo de su aplicación práctica, sino que también simboliza la evolución y maduración del lenguaje DAX, llevándolo a un nivel de interacción más intuitivo y visual con el usuario.

Introducción a Cálculos Visuales en DAX
Como analizamos previamente, la abstracción de la complejidad del modelo es un aspecto crucial para los Cálculos Visuales en DAX, facilitando así su implementación desde una interfaz visual intuitiva. Esta necesidad resalta la importancia de introducir un conjunto renovado de funciones en el Lenguaje DAX. Para profundizar en esta comprensión, dirijamos nuestra atención a la ilustración que sigue. Aquí, el objeto visual ejemplificado es un Gráfico de Barras Agrupadas. Se puede apreciar cómo asociamos los datos del gráfico a una matriz subyacente, la cual es en realidad un agregado de las tablas del modelo. Esta matriz agregada, sin embargo, se deriva directamente del gráfico. En este enfoque innovador, los Cálculos Visuales en DAX no se procesan en segundo plano dentro del modelo, sino que se llevan a cabo directamente en esta tabla de datos ya agregados, vinculada estrechamente con el objeto visual en la vista de informes.

Ahora que comprendemos que los Cálculos Visuales en DAX se ejecutan en un entorno aislado, específicamente en una matriz agregada que está vinculada al objeto visual, es importante reconocer ciertas cualidades en la funcionalidad. Por ejemplo, funciones que operan directamente sobre el modelo semántico, como RELATED, RELATEDTABLE o USERELATIONSHIP, no serán aplicables en el ámbito de los Cálculos Visuales en DAX. Sin embargo, hay una serie de otras funciones que no requieren este vínculo directo con el modelo, como IF, AVERAGE, o SWITCH. Estas pueden ser utilizadas con eficacia en los Cálculos visuales en DAX.
Ahora bien, retomando un punto clave que ya habíamos esbozado, los Cálculos Visuales en DAX no solo innovan en funcionalidad sino también en su arsenal de herramientas. Están equipados con un repertorio de funciones nuevas y exclusivas para este ‘sand box’ especializado. Entre estas joyas analíticas se encuentran RUNNINGSUM y EXPAND, cada una con su potencial único para enriquecer el análisis de datos.
Es momento de sumergirnos en la esencia de estas funciones, desentrañando su genio y aplicabilidad, y así revelar cómo pueden revolucionar nuestro enfoque y comprensión de los datos dentro del universo DAX.
Creación de mi primer cálculo visual en DAX
Primero 👉🏽
Creemos una página en la Vista de Informe de Power BI utilizando el modelo DisproductosLD, con un Gráfico de Barras Agrupadas. Este gráfico debe tener en el área del Eje Y el campo Categoría de Producto de la tabla de dimensión CategoriaDeProductos y, en el área del Eje X, las medidas [Ingresos Tot] y [Costos Tot], tal como se muestra en la imagen:

Te comparo la definición de cada medida para no dejar el más mínimo vestigio de duda:
— Ingresos Tot
1 | Ingresos Tot = 2 | SUM ( Pedidos[Ingresos] )
— Costos Tot
1 | Costos Tot = 2 | SUMX ( 3 | Pedidos,4 | Pedidos[CostoDeEmpaque] 5 | + Pedidos[CostoDeEnvio]6 | + Pedidos[CostoDelProducto]7 | )
Las opciones para acceder a los Cálculos Visuales en DAX son variadas y accesibles. Una de las más comunes es dirigirse a la pestaña Modelado y, dentro del grupo Cálculo, encontrarás la opción Cálculo Visual. Otra alternativa práctica es, con el objeto visual ya seleccionado, hacer clic derecho y, en el menú contextual que aparece, seleccionar Nuevo cálculo.
Adicionalmente, podemos hacerlo desde la pestaña Inicio, dentro del grupo Cálculos, donde también encontraremos el comando Cálculo Visual o Nuevo Cálculo, es importante que el gráfico este seleccionado para que esta opción aparezca habilitada.

Al llevar a cabo esta acción, veremos emerger en la parte inferior del objeto visual (en nuestro caso, un gráfico de barras apiladas) la matriz visual correspondiente. Este espacio dinámico no solo expone de manera clara los datos vinculados al gráfico, sino que también resalta la presencia de la barra de fórmulas DAX, a la espera para que creemos nuestra expresión DAX.

Iniciemos con algo muy sencillo crear el cálculo de Utilidad que no es otra cosa que la resta entre [Ingresos Tot] y [Costos Tot] cuya expresión es:
1 | Utilidad = [Ingresos Tot] - [Costos Tot]
Al redactar la expresión DAX y luego ejecutar, notamos que el resultado no se limita solo a la inclusión de la columna [Utilidad] en la matriz visual; también se observa su adición al objeto visual vinculado, en este caso, al gráfico de barras agrupadas. Esta integración demuestra la interconexión entre la matriz visual y el objeto visual.

Referenciación de campo visuales
La expresión utilizada en el Cálculo Visual anterior hace referencia a las columnas o campos visuales presentes en el objeto visual, y no directamente al modelo semántico. Esto significa que, por ejemplo, al referenciar [Ingresos Tot] en un cálculo visual, no estamos invocando la medida del mismo nombre definida en el modelo semántico. En realidad, estamos haciendo referencia al campo [Ingresos Tot] que forma parte de la matriz visual asociada al gráfico de barras agrupadas. Por esta razón, estos campos no se identifican con el calificativo de la tabla, como sería Medidas[Ingresos Tot], ya que no pertenecen a ninguna tabla del modelo, sino a una columna específica dentro de la matriz visual.
Esta distinción también implica que si tenemos una medida llamada [Unidades Tot] en el modelo, pero no está incluida en el objeto visual, entonces no podrá ser invocada o referenciada en el Cálculo Visual en DAX.
Es un principio bien establecido en la comunidad DAX que resulta esencial distinguir claramente entre una columna calculada y una medida. Por esta razón, se ha adoptado la convención de nombrar una columna calculada especificando la tabla a la que pertenece, como en Pedidos[Ingresos], mientras que una medida se señala sin mencionar la tabla, por ejemplo, [Ingresos Tot]. Esta práctica se ha convertido en una norma universal. De manera similar, la convención de designar las columnas calculadas virtuales con un prefijo arroba (@), tal como en [@Utilidad], especialmente en contextos fuera de una consulta DAX, también se está consolidando como una convención estándar.
Esta práctica facilita el discernimiento en la ejecución y la transición de contextos. Ante este escenario, podría pensarse que necesitamos una convención similar para diferenciar la referencia a campos visuales como [Ingresos Tot]. Sin embargo, es importante recordar que los cálculos clásicos DAX se realizan dentro del modelo y, por tanto, no interactúan con los cálculos visuales, que a su vez se ejecutan al final de la cadena de procesamiento de datos, sin interferir con los cálculos DAX tradicionales.
Creación de cálculo visual con RUNNINGSUM
Procedamos a crear un segundo cálculo visual, lo que nos permitirá profundizar en los detalles de este nuevo paradigma. El cálculo visual que vamos a desarrollar será el acumulado de la columna visual denominada Utilidad. Esto significa que, al posicionarnos en la ‘celda’ correspondiente a Libro, el valor que esperamos ver allí será el resultado de sumar:
Valor de la categoría Blueray + Valor de la categoría CD + Valor de la categoría Libro
Así es un acumulado, desde el primer valor hasta el actual, aunque siempre asociamos este tipo de cálculos a fechas, es válido también para jerarquías de categorías.
Podemos resolver esta métrica de manera sencilla utilizando la función RUNNINGSUM. Esta función es una de las novedades que se introducen con los Cálculos Visuales en DAX, y su uso facilitará la obtención de sumas acumuladas en nuestros datos visualizados.
— La función es tan sencilla que parece irreal:
1 | Acumulado = RUNNINGSUM ( [Utilidad] )
Que se ve así desde nuestro Power BI una vez ejecutado:

Y, como es de esperar, la barra asociada al acumulado también hace su aparición en el objeto visual. Esta integración asegura que la representación del acumulado sea tanto visual como funcionalmente coherente con la matriz visual.
Extremadamente sencillo, simplemente impresionante ¿Por que?, bueno actualmente realizar una expresión para un acumulado de ese estilo es más demandante, aquí una forma con funciones ventana y CALCULATE:
1 | Acumulado = 2 | CALCULATE (3 | [Utilidad],4 | WINDOW (5 | 1, ABS, 0, REL,6 | ADDCOLUMNS ( ALLSELECTED ( CategoriasDeProductos ), "@Utilidad", [Utilidad] ),7 | ORDERBY ( CategoriasDeProductos[CategoriaDeProducto], ASC )8 | )9 | )
Sintaxis Azucarada
A partir de lo discutido anteriormente, es oportuno destacar que las nuevas funciones visuales asociadas a estos cálculos visuales en DAX no son más que una elegante Sintaxis Azucarada o notación simplificada de la función CALCULATE, en combinación con una o más funciones de ventana tales como INDEX, OFFSET, WINDOW, RANK, ROWNUMBER. Además, se complementan con funciones auxiliares como ORDERBY, PARTITIONBY y MATCHBY, integrando también otras funciones adicionales de la amplia base del Lenguaje DAX.
— En definitiva:
1 | RUNNINGSUM ( <Campo Visual> )
— Es una Sytax sugar de:
1 | CALCULATE (2 | <Campo Visual>,3 | WINDOW (4 | 1, ABS, 0, REL,5 | ADDCOLUMNS ( ALLSELECTED ( <Matriz Visual> ), "@CampoVisual", <Campo Visual>),6 | ORDERBY ( <Matriz Visual>, ASC | DESC )7 | )8 | )
Esta misma lógica se aplica a todas las funciones de cálculo visual que detallaremos más adelante. En esencia, cada una representa una Sintaxis Azucarada que combina CALCULATE con una Función de Ventana y elementos adicionales.
Es importante señalar que las funciones de ventana aportan una mayor flexibilidad para casos avanzados, si es necesario. Sin embargo, a diferencia de las funciones de cálculo visual de alto nivel, estas funciones de ventana son más técnicas y complejas. Aunque su comprensión inicial puede ser sencilla para tareas básicas, lograr un dominio completo de ellas resulta considerablemente desafiante. De hecho, estas son las funciones más complejas de entender y dominar al 100% en el Lenguaje DAX, incluso más que CALCULATE y ALLSELECTED.
¿Dónde queda el cálculo visual?
El lugar donde residen los Cálculo Visual DAX es específico: está íntimamente vinculado al objeto visual. Por lo tanto, lo observaremos en el Eje X en el panel de campos con el objeto visual correspondiente seleccionado lo veremos. En otras palabras, se encuentra en las áreas de configuración donde arrastramos y soltamos campos para definir el objeto visual.
Aunque puedan parecer una medidas común y corriente, al agruparse con las otras medidas, se distingue claramente como un Cálculo Visual por el icono de gráfico de barras con ‘fx’ en el extremo izquierdo.

Propiedad Ocultar (Hidden)
Un concepto que viene con los Cálculos Visuales en DAX es la propiedad Hidden (Ocultar). Como hemos visto, el Cálculos Visuales se refleja directamente en el objeto visual, como lo es el caso de Utilidad y Acumulado en el Gráfico de Barras Apiladas que mencionamos anteriormente.
Ahora, consideremos un escenario en el que deseamos remover Utilidad del gráfico, pero mantener Acumulado. La idea es que, aunque no se visualicen en el objeto visual, ambos elementos sigan formando parte integral de la matriz visual, ya que de lo contrario, el cálculo de Acumulado dejaría de funcionar correctamente. Lograr esto es bastante sencillo: en el panel de campos, donde se visualiza el cálculo, encontraremos un icono específico. Este nos permite ocultar Utilidad del gráfico, manteniendo su funcionalidad en la matriz visual. La imagen que se muestra a continuación ilustra claramente este proceso.


Orden de la Matriz Visual
Otro aspecto importante a tener en cuenta es que la función RUNNINGSUM sigue el orden visual presentado en la matriz visual. Por esta razón, ejecuta el acumulado siguiendo el orden de las categorías, aunque estén en letras (como Blueray, CD, Combo y Libro), debido a que se basa en un orden lexicográfico, es decir, de la ‘A’ a la ‘Z’.
Pero, ¿Qué ocurre si reordenamos la matriz visual de forma descendente?
Esto se puede lograr fácilmente haciendo clic en la pequeña flecha ubicada en el extremo izquierdo de la columna CategoriaDeProducto en la matriz visual. Al hacerlo, el orden cambia de la ‘Z’ a la ‘A’, resultando en un nuevo ordenamiento: Libro, Combo, CD y Blueray, como se muestra a continuación:

Como se ha evidenciado en la imagen anterior, el Cálculo Visual en DAX, en nuestro caso Acumulado, se ajusta al orden establecido en la matriz visual. En esta ocasión, el acumulado sigue el orden de la ‘Z’ a la ‘A’. Por ejemplo, al analizar la ‘celda’ correspondiente a Combo, su valor acumulado es la suma del:
Valor de Utilidad de Libro más el valor de Utilidad de Combo
Si nuestro objetivo es que el cálculo siga un orden distinto al presentado visualmente en la matriz visual, entonces es allí el momento de sumergirnos más profundamente, adentrándonos en las capas del modelo semántico. Esta inmersión nos permite explorar con mayor flexibilidad el uso de funciones de ventana y CALCULATE, aprovechando toda la riqueza del Lenguaje DAX a un nivel más técnico y detallado.
Cabe destacar que, cuando hablamos de Bajo nivel en el contexto de DAX, nos referimos a algo más detallado y complejo. Esto se debe a que está más cercano al modelo semántico, involucrando un conocimiento más profundo de cómo se estructuran y se procesan los datos. Por otro lado, cuando mencionamos términos de Alto nivel, estamos hablando de conceptos y procesos considerablemente más sencillos y menos técnicos, ya que se distancian de la complejidad del modelo semántico. Esta distinción es crucial para entender la variedad de enfoques y niveles de dificultad que se pueden encontrar al trabajar con el Lenguaje DAX.
Medidas Implícitas y Grupos de Cálculo
Todo lo que añadimos a un objeto visual se convierte en susceptible de ser utilizado en los Cálculos visuales en DAX. Esto incluye, por ejemplo, arrastrar una columna del modelo a un gráfico, lo cual se transforma en una medida implícita que después puede ser manipulada dentro de un cálculo visual. De igual manera, al incorporar un Grupo de Cálculo en un objeto visual, sus columnas (o elementos) se vuelven accesibles para ser utilizadas a través de referencias dentro de la matriz visual en los cálculos visuales. Esta flexibilidad demuestra la capacidad de DAX para adaptarse y manejar diferentes tipos de datos y estructuras dentro de un entorno visual.

Aunque para entender mejor, es menester estudiar otros temas primero.
Entendiendo la Dirección en Cálculos Visuales en DAX
Estamos apenas rozando la superficie de las posibilidades que nos brindan los Cálculos Visuales en DAX. La flexibilidad para transitar la matriz visual según nuestras necesidades es impresionante. Tomemos, por ejemplo, nuestro primer caso con RUNNINGSUM: el acumulado se desplazó verticalmente, es decir, a través de las filas. Este comportamiento, aunque predeterminado, no fue explícitamente definido por nosotros. No obstante, uno de los conceptos clave que los Cálculos visuales en DAX incorporan es el de Dirección. Esta Dirección define de manera precisa el trayecto que seguirá un cálculo, apoyándose en dos pilares fundamentales:
• Eje (Axis)
• Reseteado (Reset)
Antes de adentrarnos en la comprensión más profunda del concepto de Dirección, es esencial que exploremos estos dos elementos clave para apreciar plenamente su impacto y funcionalidad.
Eje (Axis) para recorrer matriz visual
¿Qué sucede si deseamos que el acumulado se realice de manera horizontal, es decir, moviéndose a través de las columnas?
Puede parecer un poco inusual, pero exploremos esta posibilidad: transformemos nuestro anterior gráfico de barras apiladas en un objeto visual tipo matriz. Además, vamos a incorporar el campo Año de la dimensión Fechas en el área de Columnas. Así, nuestra matriz quedaría configurada de la siguiente manera: en el área de Filas tendríamos el campo CategoriaDeProductos de la tabla CategoriaDeProductos; en Columnas, el campo Año de la dimensión de Fechas; y en el área de Valores, las medidas [Ingresos Tot], [Costos Tot] y los cálculos visuales [Utilidad] y [Acumulado]. No obstante, nos aseguraremos de ocultar [Ingresos Tot] y [Costos Tot] y dejar visibles únicamente [Utilidad] y [Acumulado].

También es importante no perder de vista que el campo CategoriaDeProductos, ha sido ordenado de manera ascendente en la configuración de la matriz.
Al dirigirnos al modelo de cálculo visual en la matriz y hacer clic derecho sobre ella para seleccionar Nuevo cálculo, observamos que se asocia con la matriz visual. Esta presenta una diferencia notable: la matriz visual muestra todo lo que se encuentra en el área de valores, incluyendo [Ingresos Tot], [Costos Tot], [Utilidad] y [Acumulado], incluso si algunos de estos elementos están ocultos. Por otro lado, el objeto gráfico de la matriz, que es el que finalmente se visualiza en el informe, solo muestra [Utilidad] y [Acumulado].
Hemos elegido trabajar con una objeto visual de matriz para explorar p ara explorar más a fondo los cálculos visuales en DAX, Sin embargo, es importante mencionar que estos conceptos también serían aplicables a cualquier otro tipo de objeto visual, como, por ejemplo, un gráfico de barras con múltiplos pequeños, un gráfico de líneas con múltiples ejes, entre otros.

Observa el Acumulado para el año 1999, veremos que este acumulado ocurre a través de las filas.

Ahora, busquemos lograr un Acumulado que se realice a través de las columnas. Por ejemplo, para calcular el acumulado en la celda correspondiente al Año 2000 y la CategoriaDeProducto Blueray, deberíamos sumar el valor de Utilidad de Blueray para 1999 más el valor de Utilidad de Blueray para 2000. La siguiente imagen ilustra esta idea.

Lograr esto con cálculos visuales es extraordinariamente sencillo. Anteriormente utilizamos la función RUNNINGSUM para realizar el acumulado a través de las filas, y resulta que este recorrido por filas (ROWS) es el comportamiento por defecto. Sin embargo, es posible alterar el comportamiento de RUNNINGSUM para que se realice a través de las columnas.
¿Cómo hacerlo? Bueno, anteriormente vimos solo el parámetro obligatorio de la función, pero en realidad RUNNINGSUM cuenta con tres parámetros en total. Veamos su sintaxis:
1 | RUNNINGSUM ( Expression, [Axis], [Blanks] )
Parámetro | Atributo | Descripción |
Expression | Obligatorio | Expresión que se desea cumular. |
Axis | Opcional | Eje (Axis) por el cual desea el recorrido en la matriz. ROWS si se quiere el recorrido atreves de las filas (movimiento vertical), COLUMNS si se quiere el movimiento atreves de columnas (movimiento horizontal), ROWS COLUMNS si se quiere el movimiento de filas a columnas estilo zig zag y COLUMNS ROWS si se quiere el recorrido de columnas a fila. El valor por defecto es ROWS. |
Blanks | Opcional | Una enumeración que define cómo manejar los valores en blanco al ordenar. |
Por lo que la solución a esta demanda es sólo la expresión:
1 | AcmCOLUMNS = 2 | RUNNINGSUM ( [Utilidad], COLUMNS )
Para facilitar la comprensión del resultado, en la imagen que sigue he ocultado el cálculo visual DAX de [Acumulado] y he dejado visible solo [Utilidad] y [AcumCOL].

Consideraciones en Cálculos Visuales en DAX
En este punto, es relevante destacar varias consideraciones clave acerca de los cálculos visuales en DAX:
• Los Cálculos Visuales en DAX se definen únicamente en la parte visual y, por lo tanto, no son visibles en el panel de datos.
• Los Cálculos Visuales en DAX sólo pueden referenciar a campos dentro del propio objeto visual, a los cuales podríamos denominar Campos Visuales.
• Los Cálculos Visuales tienen la capacidad de hacer referencia a otros Cálculos Visuales.
• Los Cálculos Visuales, pueden referenciar a otras estructuras del objeto visual, no limitándose solo a Campos Visuales.
• Los Cálculos Visuales Simplifican considerablemente elementos que añaden complejidad al Lenguaje DAX, como los contextos (fila, filtro y transición), la propagación de filtros, entre otros.
• Los Cálculos visuales en DAX vienen acompañados de un nuevo conjunto de funciones denominadas Funciones de Cálculos Visuales, las cuales son sencillas de utilizar y ayudan a simplificar procesos complejos. Es importante mencionar que estas funciones son una Sintaxis azucaradaa del Lenguaje DAX clásico, combinada con funciones de ventana.
• Las funciones de Cálculos Visuales serán fácilmente identificables, ya que incluirán en su parámetro [Axis].
• Ahondemos más en cada punto.