En todos los cursos de #PowerBI que imparto yo también aprendo algo. Siempre reto a mis alumnos a que me pregunten algo que no hayan visto resuelto en ningún sitio y en este último curso no podía ser menos.
Me planteó un alumno lo siguiente: «Quiero poder elegir el atributo dimensional que yo quiera, familia o subfamilia que están en la tabla de productos o país que está en la tabla de clientes, o cualquier otro y simplemente con elegir ese atributo, que tendré en una slicer, debe representarme en cualquier visual las ventas teniendo como eje ese atributo dimensional».
En un principio mi respuesta fue obvia, utilizamos tres tablas diferentes y las mostramos u ocultamos a nuestro antojo con marcadores a lo que él me dijo, eso ya sé que se puede hacer, quiero saber si se puede hacer con cálculos DAX, sin usar marcadores.
Justo ese día estábamos viendo la función TREATAS y me pareció una vía para poder hacerlo, ya que no quería darle una respuesta compleja de crear la dimensión usando CROSSJOIN ni relaciones muchos a muchos, esas vías las había visto en algunos blogs, se podían conseguir pero no acababan de convencerme. Busqué algo más sencillo. Así que me puse manos a la obra. 1º necesitaba mi tabla de selección de la dimensión. Muy simple:
En segundo lugar, un poco más complejo, necesitaba mi tabla en la que unir todos mis valores únicos de cada una de los atributos dimensionales propuestos, pero con la unión de las columnas con sus elementos únicos con VALUES en una misma tabla estaba conseguido:
Crear tabla:
Dimension =
FILTER(
UNION(
VALUES(dProductos[Familia]);
VALUES(dProductos[SubFamilia]);
VALUES(dClientes[Pais]));
NOT(ISBLANK(dProductos[Familia])))
El FILTER simplemente es para cargarme a mi amigo el elemento desconocido que devuelve el blanco como uno de los valores únicos de una columna ya que existen productos sin Familia o sin Subfamilia y podrían existir, aunque no es el caso, clientes en los que no estuviera informado el País.
El nombre del campo de la tabla resultante lo cambiamos por «Nombre»
* Nótese que ni siguiera voy a necesitar clasificar los diferentes elementos de la dimensión en su nivel.
Y por último, faltaba crear mi medida de ventas dimensional, que mostrará un eje u otro dependiendo del slicer seleccionado:
VentasDimension =
var DimensionX=SELECTEDVALUE(‘dDimensión'[Dimension])
return
SWITCH(TRUE();
DimensionX=»Familia» ; CALCULATE([Ventas];TREATAS(VALUES(‘Dimension'[Nombre]);dProductos[Familia]));
DimensionX=»Subfamilia»; CALCULATE([Ventas];TREATAS(VALUES(‘Dimension'[Nombre]);dProductos[SubFamilia]));
DimensionX=»Pais»;CALCULATE([Ventas];TREATAS(VALUES(‘Dimension'[Nombre]);dClientes[Pais]));
BLANK())
Y el resultado, tan sorprendente como esperado:
Gracias @Eduardo Hernanz Moreno por el reto, que creo que queda sobradamente resuelto.
3 comentarios