#PowerBI tips: Crear una visualización en la que el eje sea dinámico.

#PowerBI tips: Crear una visualización en la que el eje sea dinámico.

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:

No hay texto alternativo para esta imagen

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:

No hay texto alternativo para esta imagen
No hay texto alternativo para esta imagen
No hay texto alternativo para esta imagen

Gracias @Eduardo Hernanz Moreno por el reto, que creo que queda sobradamente resuelto.

Francisco Mullor Cabrera

3 comentarios

Manuel Ramón Ramón Publicado el7:09 am - 25/10/2019

Hola Fran, lo primero enhorabuena por el blog. En segundo lugar una pregunta, siempre me he preguntado porque usar VALUE que nos devuelve los valores distintos y BLANK en vez de usar directamente DISTINCT. Te lo digo porque veo como proteges la función de BLANK (por si existe miembro desconocido)con FILTER( …., NOT(ISBLANK(dProductos[Familia]))) y me pregunto porque no encajaría DISTINCT en estos casos. Un saludo

    FranM Publicado el7:39 am - 25/10/2019

    Hola Manuel, muchas gracias. Tanto VALUES como DISTINCT nos van a arrojar el mismo resultado y nos van a mostrar el blank() tanto cuando nos traemos la FAMILIA como cuando nos traemos la SUBFAMILIA porque existen productos que no tienen Familia y que no tienen Subfamilia. No ocurre eso, sin embargo, cuando nos traemos los países porque todos los clientes tienen país, pero es recomendable hacer el NOT(ISBLANK…) en todo caso, por si en cualquier momento en nuestro origen hubiera un elemento en blanco.

    Manuel Ramón Ramón Publicado el7:45 am - 25/10/2019

    Upss. Quise decir VALUES

Deja una respuesta