Como dice el refrán, los lunes son de post J

Hoy vengo con la tercera función tipo tabla, que es RELATEDTABLE y que creo que hay que tenerla en localizada.

Vamos con la función RELATEDTABLE. Según la documentación oficial de Microsoft, la función tiene la siguiente sintaxis DAX:

 

Donde tableName es el nombre de una tabla existente que usa la sintaxis DAX. No puede ser una expresión

¿Qué hace la función?

La función RELATEDTABLE evalúa una expresión de tabla en un contexto modificado por los filtros especificados. ¿Qué quiero decir? Pues que la función RELATEDTABLE cambia el contexto en el que se filtran los datos y evalúa la expresión en el nuevo contexto que se especifica.

Esta función es un acceso directo a la función CALCULATETABLE (que la veremos en el siguiente post) sin ninguna expresión lógica.

Esta función no se admite para su uso en el modo DirectQuery cuando se utiliza en columnas calculadas o en reglas de seguridad de nivel de fila (RLS).

Una vez comentado la teoría de la función, vamos a analizarlo con nuestra base de datos de Contoso con ejemplos para interiorizarlo.

Tenemos el siguiente modelo:



¿Qué modelo es? ¿Estrella? ¿Copo de nieve?... Es un esquema en copo de nieve con una dimensión desconectada que es DimProduct.




¿Y por qué es una dimensión desconectada? Porque la tabla no está relacionada con ninguna otra tabla del modelo. La tabla desconectada no pretende propagar filtros a otras tablas del modelo ya que no tiene relación física (aunque más adelante veremos que sí se puede propagar mediante la función TEATRAS, pero no es el objetivo de este post). Los parámetros de hipótesis de Power BI Desktop es una característica que crea una tabla desconectada, si no has leído el post de los parámetros de campo, te dejo aquí el enlace.

 

Nota: acordaros que para Power BI los modelos que mejor rendimiento dan son los de esquema en estrella siempre que se pueda.

 

Bien, una vez ya he divagado un poco, vamos calcular el total de productos por cada categoría de productos. ¿Y cómo logramos el total de productos por cada categoría de producto? Pues como bien habréis deducido usaremos la función RELATEDTABLE.

Para ello, creamos la siguiente columna calculada:

 

 

Y nos devuelve:

¡Uy, qué casualidad! Tenemos en mismo número de productos por cada categoría… Pues no, no lo hay… ¿por qué no nos muestra los valores reales que existen? Por la sencilla razón que para que la función RELATEDTABLE funcione correctamente ha de existir una relación física entre las tablas y que la tabla a dónde queremos “traernos” los datos, esté en el lado del uno y la tabla que contiene la información en el lado del varios, por lo que para este caso la tabla DimProductCategory debe estar en el lado del uno y la tabla DimProduct en el lado del varios.

 

Para ello, relacionamos la tabla DimProductCategory con la tabla DimProductSubcategory de la siguiente manera:


 



De manera que el filtro entre la tabla DimProductCategory se propaga hasta la tabla DimProduct a través de la tabla DimProductSubcategory, y como podemos ver en la columna calculada, el valor ya no es el mismo:

 


Recordad también, qué al ser una columna calculada, esta se materializa cuando se carguen los datos en el modelo y no en tiempo de ejecución por lo que no se va a ver afectada nunca por los filtros.

Una vez visto el funcionamiento simple de RELATEDTABLE, vamos a ver otro ejemplo con iteradores, que suele ser su uso más habitual generalmente. Para ello, vamos a crear la siguiente columna calculada para calcular el total de ventas por categoría de producto:

 


 Y como resultado nos arroja lo siguiente:


 

 

¿Qué es lo que cálculo se está realizando? Calculamos mediante el iterador SUMX, recorremos toda la tabla calculando la cantidad vendida por su precio unitario de la tabla relacionada FactOnlineSales y de esta manera, al estar relacionadas, podemos traernos el valor por el total de las ventas. ¿Se entiende?

Bien, vamos a darle una vueltecilla más. Partiendo de la columna anterior, vamos a crear un ranking para obtener el ranking de las categorías de producto por el volumen de las ventas y para ello creamos la siguiente columna:

 


 

 


En el ejemplo, estamos usando RANKX, que es un iterador que me permite hacer un ranking. Lo que le estamos indicando es para este ranking, coges todas las categorías de los productos de la tabla DimProductCategory, ya que tenemos un ALL para ignorar el contexto de filtro (sino has leído el post de la función ALL, te dejo aquí el enlace).

Luego le pasamos la manera por la que se quiere realizar el ranking, que es la suma de las ventas. ¿Y cómo logramos las ventas para cada categoría de producto? Con RELATEDTABLE, evidentemente que es el objeto de este post.

La medida que hemos creado para el calculo del ranking, fijaros que tenemos dos iteradores (RANKX y SUMX) y dos funciones tipo tabla (ALL y RELATEDTABLE).

 

Conclusiones

 

La función RELATEDTABLE cambia el contexto en el que se filtran los datos y evalúa la expresión en el nuevo contexto que se especifica. Tiene que existir una relación física entre la tabla que queremos relacionar con la tabla donde se encuentra la información, donde la tabla a donde queremos “traernos” la información tiene que estar en el lado del 1 de la relación y la tabla con la información que nos queremos traer en el lado del varios.

 

¡Nos vemos en los datos!