Este escrito forma parte de la serie: Escenarios de Modelado con DAX
Algunos de los recursos que he consultado sobre Modelado tabular y DAX los podemos encontrar en Modelos tabulares y DAX – Recursos
Muchísima gente que llega al mundo del DAX con Power BI viene de la mano de Excel y las Tablas dinámicas. Eso está muy bien, hay mucha experiencia que es posible reutilizar para trabajar con el modelo tabular y DAX y particularmente con Power BI.
Lo que sucede es que ahora, al trabajar con Modelos tabulares, llega el momento de pensar de una forma un tanto diferente. Especialmente a la hora de decidir entre Columnas calculadas y Medidas.
Aspectos que tienen en común las columnas calculadas y las medidas:
- Misma sintaxis para escribir expresiones DAX
- Misma Barra de fórmulas con mismo Intellisense y conjunto de funciones a su disposición
- Mismo objetivo, enriquecer el Modelo tabular que ha sido cargado al procesar las consultas.
Vayamos a nuestro ejemplo. En la tabla Ventas, tenemos las columnas Cantidad, Precio y Coste, a partir de las cuales queremos obtener el Importe Ventas, Beneficio y el % de Beneficio.
Desde ya pido que no nos centremos en la exactitud de las fórmulas, es apenas utilizar lo que tenemos y avanzar con los ejemplos.
Columnas Calculadas en Modelos tabulares
Si venimos del mundo Excel, nuestra tendencia será crear columnas calculadas para garantizar estos cálculos.
Como en el caso anterior, cuando escribimos nuestra primera medida con DAX, hay varias opciones de menú para crear columnas calculadas y además, como en el caso de las medidas, aparece la barra de fórmulas y la sintaxis DAX para escribir medidas y columnas calculadas es la misma, la sintaxis es la misma, lo que es diferente es lo que el motor espera evaluar en una medida y en una columna calculada. Lo iremos viendo.
Para crear columnas calculadas mi recomendación es situarse en la ficha Datos, en este caso, mostrando la tabla Ventas, y seleccionar Nueva Columna
Desde la barra de fórmulas estamos listos para escribir la expresión que va a ser evaluada por cada una de las filas de la nueva columna calculada, para la que como vemos en la imagen ya se ha reservado un sitio en la tabla.
Es posible crear tantas columnas calculadas como se desee; pero cuidado… muchísimo cuidado con las columnas calculadas… poder, se puede trabajar con ellas; pero pueden ser muy dañinas para el Modelo tabular. Las columnas calculadas no están recomendadas. Voy a insistir una y otra vez y veremos ejemplos que lo demuestran, uno de los casos, hoy mismo.
En la Barra de fórmulas, vamos a contar con la inestimable ayuda de IntelliSense, igual que en el caso de las medidas. Escribir la expresión Importe Ventas = Cantidad * Precio, es tan sencillo como seleccionar las columnas con el Intellisense.
En la medida que vamos tecleando Intellisense es más útil
Al crear las columnas, y es válido también para las medidas, podemos y debemos asignar el formato adecuado. Esta asignación a nivel de modelo de datos permite que ya aparezca con formato cuando se utilice en los gráficos, tarjetas y otras visualizaciones de Power BI. No olvidéis dar formato a nivel de modelo a cada columna y medida que vayáis a utilizar.
De esta forma, definimos la expresión DAX para Importe Ventas.
Definimos la expresión DAX para Beneficios.
Y por último, definimos la expresión DAX para % Beneficio.
En este caso, voy a hacer un paréntesis aclarando algunos aspectos relacionados con esta expresión
- El nombre de la columna, % Beneficio, es correcto. En el modelo tabular las columnas siempre, siempre van entre corchetes, por lo que admiten todo tipo de espacios y caracteres que se quiera definir
- Para trabajar con cálculos que implican división nos enfrentamos al dilema de la división por cero, tendríamos que utilizar una función que comprobara antes de hacer la división. Las funciones de control de errores en DAX son lentas, no favorecen el óptimo rendimiento del motor. Hay que evitarlas a toda costa. Para ello, siempre hay que definir bien el tipo de datos y en este caso, utilizar la función DIVIDE(), que ya está optimizada y se encarga de comprobar que no ocurra la División por cero.
- Por otra parte, al tratarse de un % hay que indicar también el formato adecuado
En la tabla Ventas, podemos ver las tres columnas que han sido calculadas. Si nos detemenos fila a fila, vemos que el resultado es correcto, las expresiones se han evaluado de forma adecuada, todo parece ir bien.
Una vez creadas las columnas, el siguiente paso es utilizarlas en una visualización, en nuestro caso será una sencilla tabla. Vamos a analizar el resultado de estas tres expresiones según sea la categoría de los productos vendidos.
Empezamos por las dos primeras columnas calculadas: Importe Ventas y Beneficios.
Mostramos luego, la columna calculada % de Beneficios.
Los valores devueltos por las columnas Importe Ventas y Beneficios tienen buen aspecto, parecen razonablemente bien, de hecho son correctos. Pero la columna % de Beneficios devuelve valores completamente irreales e incorrectos. No tenemos ningún mensaje de error; pero no cabe duda de la incoherencia de los datos.
¿Te haces una idea de lo que ha ocurrido? Pues lo que ha ocurrido es que la columna calculada, a efectos de uso en un informe, se comporta como una columna nativa y al añadirla al informe crea una medida implícita, agregando los valores, sumándolos, como mismo vismos al analizar Medidas implícitas vs Explícitas. Está sumando los Porcientos de Beneficios obtenidos fila a fila en lugar de devolver el Porciento que representan los Beneficios sobre las Ventas.
Podríamos intentar mostrar el Porciento de contribución al padre, reutilizando la columna Beneficios y la funcionalidad Mostrar como porciento del total general, de Power BI Desktop, que es por cierto, la misma que en Excel.
El valor devuelto es correcto; pero no es lo que necesitamos. Al menos, es correcto.
Implicación de crear columnas calculadas para Modelos Tabulares
Voy a resumir algunos de los aspectos a tener en cuenta cuando se crea una columna calculada:
- Se evalúa la expresión para cada una de las filas de la tabla
- Durante la evaluación se crea algo que conoceremos luego como Contexto de fila, que permite al motor conocer el valor exacto de cada columna involucrada en la expresión a evaluar
- Se almacena el resultado correspondiente en cada una de las filas de la tabla
- No se aplica ninguna acción de filtrado en este momento, no existe lo que luego conoceremos como Contexto de Filtro
- En el proceso de escritura de la expresión DAX, encontramos que, sin utilizar funciones de relaciones o navegación, no es posible ver columnas fuera de la tabla actual.
- En materia de procesamiento de Modelo Tabular, las columnas calculadas se procesan una vez procesadas todas las tablas que vienen de las consultas o de expresiones DAX que devuelven tablas al modelo. Durante el procesado de las nuevas columnas calculadas no es posible aplicar los algoritmos de optimización que resultan muy eficientes en la primera fase.
- Para colmo de males:
- El resultado puede ser incorrecto, tal y como hemos visto hoy. No es posible utilizar columnas calculadas para todo. En caso de ratios o porcientos de contribución al padre, no es posible.
- Y en otros casos, puede parecer que está bien; pero luego el resultado es incorrecto si se aplican filtros que no afectan a la tabla en cuestión.
Para dar a solución a todos estos escenarios, podemos y debemos trabajar con Medidas, creadas con expresiones DAX para enriquecer los Modelos tabulares, que es nuestro objetivo.
En esta serie veremos otros ejemplos de las ventajas de trabajar, siempre que sea posible, con Medidas, en lugar de con Columnas Calculadas.
Espero que resulte de utilidad #HappyDAXing !!! 🙂
En la próxima entrada vamos a ver cómo Crear contenedor para medidas DAX en Modelos tabulares con Power BI