DAX: Relaciones y Cálculos II

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

En la entrada anterior hablamos de las Relaciones en el Modelo tabular, hablé de los roles que cumplen las tablas a cada lado de la relación y dije que conocer estos aspectos es importante para entender cómo trabajar con columnas que se encuentren en tablas diferentes. Y al final, me despedí con un problema, al aplicar según qué filtro, el resultado de las columnas calculadas ya dejaba de ser coherente.

Esta es la imagen.

RelacionesI Filtro

Un poco de teoría primero, para ponernos en situación. Un modelo tabular está compuesto por tablas y sus relaciones.

Nuestro modelo de ejemplo, está compuesto por cuatro tablas y sus relaciones. Tiene un diseño de modelo en Estrella – Modelo Denormalizado. Todas las tablas de búsquedas o dimensiones, Productos, Fechas y Clientes apuntan directamente a la tabla de hechos, Ventas.

Modelo

Antes de solucionar el problema que hemos visto, permitirme que cierre los escenarios. Antes, creamos tres casos, vamos a por el último hoy.

Necesidad de funciones de navegación

Caso 4.- Crear columnas a partir de medidas. No hay necesidad de funciones de navegación.

Vamos a agregar una nueva columna a la tabla Producto, con la siguiente expresión DAX:

Importes desde Medida = [Total Importe]

Veamos el resultado, de momento, sin filtros

Tablacon3casos

Todos los resultados son iguales. La diferencia está en las expresiones y en el uso, o no de las funciones de navegación

Dijimos que al trabajar con columnas de tablas distintas es necesario utilizar las funciones de relación o navegación

RELATED() – Sigue la relación M:1 y devuelve el valor de la columna

RELATEDTABLE() – Sigue la relación 1:M y devuelve todas las filas que se relacionan con la fila actual

Sin embargo, si utilizamos directamente una medida, no necesitamos las funciones de navegación.

Lo que ocurre es que las medidas están envueltas en una función CALCULATE que a su vez es una función muy especial que es capaz de dejar «ver más allá», deja ver a través de las relaciones de las tablas. El no tener que utilizar funciones de navegación, o relación, reduce muchísimo la complejidad de las expresiones DAX.

Entonces, si aunque podamos y debamos hacer el cálculo desde una medida, no os creéis las advertencia que os hago 🙂 y trabajáis con columnas calculadas 😦 entonces, una recomendación que os puedo dejar es utilizar como origen para las columnas una medida y no la expresión original que tira de las columnas y exige las funciones de navegación..

Problemas con las relaciones entre tablas, las columnas calculadas, y los filtros

Ahora sí, vamos a regresar al punto donde lo dejamos la entrada anterior. Hablemos de la validez del cálculo para analizar desde columnas calculadas. Hablemos de filtros.

Para comprender lo que ha ocurrido, tenemos que volver a hablar de las desventajas de utilizar columnas calculadas vs medidas.

En cualquier caso, debo repetir, hasta la saciedad, que lo mejor es trabajar directamente con medidas, que ambas columnas calculadas en la tabla Producto, son innecesarias.

Error al trabajar con columnas calculadas

En esta tabla, se muestra la medida Total Importe y las dos columnas calculadas: Importes desde Medida e Importes

TMedidas

Caso 1.- Vamos a filtrar por una columna de la propia tabla Productos, en este caso, por Categorías.

Como vemos no hay problemas, filtra correctamente y los valores de todas las columnas coinciden.

Tablacon3casos

Caso 2.- Vamos a filtrar por una columna de cualquier otra tabla:  Fecha.

Ya no hay coincidencia

ProblemaFiltro

Lo mismo ocurre si filtramos por una columna de la tabla Clientes. Lo podemos ver en una tabla

TablaMalFiltro

O lo podemos ver en una matriz

MatrizMalFiltro

Conclusión: El análisis desde las columnas sólo es correcto si se filtra por columnas de la misma tabla.

Vamos de nuevo al diagrama de tablas y relaciones

Modelo

El filtro se propaga desde el lado Uno al lado Muchos de la relación, se propaga desde Clientes a Ventas; pero no sigue su camino hacia la tabla Productos por lo que no se ven afectadas las filas de la tabla Productos, no se aplica el filtro y la suma se mantiene igual. Lo mismo pasa al filtrar por Fecha, se propaga desde Fechas a Ventas y no sigue hasta Productos.

Por su parte, la medida recorre las filas visibles de la tabla Ventas. La visibilidad depende del contexto de filtro, que, en nuestro ejemplo se ve afectado tanto por el filtro que se aplica sobre la tabla Productos, como por los dos que se aplican sobre Clientes y Fechas.

Una vez más, es muy útil, necesario y beneficio trabajar con medidas en Modelos tabulares.

Espero que resulte de utilidad #HappyDAXing !!! 🙂

En la próxima entrada vamos a ver un ejemplo de cómo solucionar escenarios de Filtro cruzado en cálculos DAX en Modelos tabulares con Power BI

Deja una respuesta

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Salir /  Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Salir /  Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Salir /  Cambiar )

Conectando a %s

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.