En este artículo vamos a encontrarle una nueva visión y
perspectiva a un requerimiento. Puede que tras leerlo les parezca un
requerimiento muy sencillo, pero vamos a mostrar condiciones requeridas que lo
harías más eficiente y complicado.
La idea será llevar una sencilla solución basada en SWITCH según condiciones a una única medida con un único CALCULATE capas de filtrar una opción u otra incluyendo opción para "all/todos".
Veamos entonces esta curiosidad en DAX.
Hace tiempo había llegado un requerimiento bastante casual en que el usuario esperaba que luego de filtrar un segmentador, sucediera cierta acción.
Supongamos una tabla InternetSales que contiene una columna StoreSell. El usuario quería un filtro con las siguientes tres opciones:
- Owned son las ventas con InternetSales[StoreSell] = 1
- Foreign son las ventas con InternetSales[StoreSell] = 0
- All son todas las ventas
A simple vista uno podría pensar que hace una tabla con esos tres valores y una medida con un SWITCH preguntando si es "Owned" hacer un calculate filtrando eso y así con cada uno.
La cuestión se complica porque el usuario es técnico y no le hace gracia tener un CALCULATE en cada respuesta del SWITCH. Más aún agrega que al no seleccionar ninguno, debe mostrar por defecto lo mismo que "Owned".
En un principio parecía imposible hasta que cambiamos el modo de pensar. El Switch no ayudaría a hacer un calculo distinto sino a construir el argumento "[Filter]" dentro de un única CALCULATE. El argumento Filter de CALCULATE permite construir un filtro bajo una condición o una tabla especifica bajo la cual manejar el contexto. Entonces la idea sería que loguremos que InternetSales[StoreSell] sea igual al valor seleccionado en el filtro visual dentro de nuestra medida.
Para capturar esto vamos a generar una tabla. Si una tabla que contenga una o dos filas. Vamos a revisar que cuando el filtro sea "Foreign" la tabla tendría una fila y columna con un 0. Luego al clickear "All" debería devolver dos filas, un 1 y un 0. Finalmente, no como "Awned" sino como valor por defecto estaría la tabla con un 1 dado que si no clickeamos nada el usuario espera ver "Owned".
Esto se generaría gracias a GENERATESERIES y lo haremos según el valor seleccionado de una tablita con los tres valores

De ese modo podremos construir una tablita pequeña, para nuestro contexto, que contiene el significado del filtro. A modo de ejemplo chequeamos el valor de "All" en dax.do

Sabiendo que nuestras tablas funcionan, podemos construir nuestro cálculo.
La magia de la medida será el operar IN y conocer que podemos tomar la tabla de una variable tan simplemente incorporando unas llaves. Las llaves convierten valores, que no están físicamente almacenadas en el modelo, en una tabla. Sería como un constructor de tabla en la cual se especifica el contenido "virtual". Veamos la medida
Solucion =
VAR _hey =
SWITCH(
SELECTEDVALUE(StoreFilter[StoreType]),
"Foreign", GENERATESERIES(0,0,1),
"All", GENERATESERIES(0,1,1),
GENERATESERIES(1,1,1)
)
VAR _result =
CALCULATE(
[Sales],
InternetSales[StoreSell] IN {_hey}
)
RETURN_result
De este modo vemos que podemos pensar de otro modo, llevando nuestra selección según el filtro (swtich) a calcular el contexto de nuestro calculo y no la respuesta de el cálculo en sí. Veamos un gif de como quedaría. Donde la tarjeta de la izquierda cambiará según el filtro y el apartado de la derecha muestra los valores de cada caso.

Espero que la solución los ayude y les sirva.
Como suelo hacer, les dejo un archivo de Power Bi de ejemplo en mi github.