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!