DAX: Relaciones y Cálculos I

Posted by anabisbe on febrero 16, 2018
General

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.

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.

Caso 1: Analizar la medida combinando filtros de tablas diferentes: Productos y Clientes

Recordemos la medida: Total Importe = SUMX(Ventas; Ventas[CantidadETL] * Ventas[Precio])

Un primer filtro se propaga desde la tabla Clientes a la tabla Ventas filtrando por cada valor de la columna Nivel Ingresos

Un segundo filtro se propaga desde la tabla Productos a la tabla Ventas filtrando por cada valor de la columna Categoría

Se puede combinar ambos filtros, por ejemplo, en una matriz.

Un tercer filtro se agrega al informe, en forma de Segmentador (Slicer) desde la tabla Fechas

Los tres filtros se combinan y se aplican sobre la tabla Ventas, dejando, en cada caso las filas visibles, según sea la condición de filtro que se aplica. De esta forma podemos operar sin hacer ningún esfuerzo extra con código DAX.

Caso 2: Crear columnas calculadas que combinen columnas de tablas diferentes. Necesidad de funciones de navegación, RELATED()

Recordemos lo comentado en la entrada DAX: Columnas calculadas vs Medidas – I, con relación a la visibilidad entre tablas desde columnas calculadas.

Desde una columna calculada solamente se ven, las medidas creadas en el modelo y las columnas de la propia tabla.

Se nos plantea analizar las ventas teniendo en cuenta la columna Cantidad de la tabla Ventas y la columna PrecioCatálogo de la tabla Productos

He recomendado evitar a toda costa el trabajo con columnas calculadas para definir cálculos, por la cantidad de inconvenientes que tienen. Hoy voy a crear una columna calculada para que comprobemos otro problema que nos puede surgir si no hacemos caso a esta recomendación.

Lo primero que hacemos es intentar realizar el cálculo, Cantidad * PrecioCatálogo y no es posible, IntelliSense no muestra la columna PrecioCatálogo, significa que no está disponible.

Y si pensamos que Intellisense se equivocó, e insistimos, nos aparece el siguiente mensaje de Error

No se puede determinar un valor único para la columna ‘PrecioCatálogo’ en la tabla ‘Productos’. Esto puede suceder cuando una fórmula de medida hace referencia a una columna que contiene muchos valores sin especificar una agregación, como min, max, count o sum, para obtener un resultado único.

Y es porque, aunque las tablas estén debidamente relacionadas, desde una columna calculada no se “ve” la relación y por tanto no se puede “ir más allá”.

Llega el momento de utilizar las funciones de navegación o relación. Estas funciones que son: RELATED Y RELATEDTABLE se encargan de “dejar ver” la relación y permitirnos seguirla e “ir más allá

Si la tabla a la que queremos acceder se encuentra en el lado Uno de la relación, significa que devolverá un único valor. Tiene sentido, cada fila de la tabla Ventas se refiere a la venta de un único producto, cada fila, un producto y ese producto está una única vez en la tabla Productos, por lo que, siguiendo la relación, podemos “traer” el valor de una columna de la tabla que esté relacionada con la actual y que esté al lado Uno de la relación. Resumiendo:

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

Importes según Catálogo = Ventas[CantidadETL] *
RELATED(Productos[PrecioCatálogo])

Caso 3: Crear columnas que combinen columnas de tablas diferentes. Necesidad de funciones de navegación, RELATEDTABLE()

Si la tabla a la que queremos acceder se encuentra en el lado Muchos de la relación, significa que devolverá un conjunto de filas, que puede ser, un conjunto vacío, de una única fila o de muchas filas, según se haya vendido, o no, el producto. Tiene sentido, cada fila de la tabla Productos se refiere a la venta de un único producto, ya sea ninguna venta, una venta o muchas ventas, por lo que, siguiendo la relación, podemos “traer” el valor de todas las filas de una columna de la tabla que esté relacionada con la actual y que esté al lado Muchos de la relación. Resumiendo:

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

Importes = SUMX(RELATEDTABLE(Ventas);
Ventas[CantidadETL]*Ventas[Precio])

La siguiente imagen muestra un resumen de los valores obtenidos, los tres casos devuelven el mismo resultado 🙂

Voy a filtrar por Fecha y vamos a notar que ahora los valores obtenidos ya no son iguales 🙁

¿Cómo es posible?¿Cuál es la causa?.. lo vemos en la próxima

Espero que resulte de utilidad #HappyDAXing !!! 🙂

En la próxima entrada vamos a responder estas preguntas. Veremos un ejemplo de errores que ocurren al no trabajar correctamente las relaciones y los cálculos DAX en Modelos tabulares con Power BI

Tags: , , ,

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *