Función CROSSFILTER

También sabemos que, entre dos tablas, el filtro tiene una cierta dirección que podemos controlar nosotros parcialmente en la vista de modelo de Power BI. Por ejemplo, el modelo de datos con el que estamos trabajando es el siguiente:

Función CROSSFILTER

Según este modelo, si desagregamos un objeto visual por país (campo Geography[Country]), este filtro se va a propagar a la tabla de ventas (en verde en la imagen anterior) pero, por ejemplo, no se va a propagar a la tabla de clientes pues el filtro que une a esta tabla con la de ventas (en rojo) apunta de Customers a Sales, y no al revés. Esto supone que, si quisiéramos saber el número de clientes que han comprado por país, llevar a una tabla los campos Geography[Country] y Customers[Customer Id] -aplicando a este último la función de agregación “Recuento”- mostraría el siguiente resultado:

Función CROSSFILTER

Es decir, como nuestro filtro por país no está filtrando de forma alguna la tabla Customers, el recuento de clientes devuelve siempre el número total de clientes: 250.

Podríamos pensar que la solución a este problema sería modificar manualmente la dirección del filtro que une las tablas de ventas y de clientes para convertirlo en filtro de doble dirección, pero esto no suele ser la solución adecuada. De hecho, en la mayor parte de los casos esta modificación llevaría a modelos de datos menos eficientes y más complejos.

La solución está en modificar la dirección del filtro usando DAX, para lo que debemos recurrir a la función CROSSFILTER. Esta función requiere tres argumentos:

  • Nombre de una de las columnas que define la relación cuya dirección de filtro queremos modificar.
  • Nombre de la otra columna que define la relación.
  • Dirección del filtro de la relación. Este argumento es una cadena de texto y puede tomar varios valores. Si toma el valor “None”, se desactiva la relación. Si toma el valor “Both”, se fuerza un filtro en ambas direcciones. Si toma el valor “OneWay”, el filtro va desde la tabla del lado “uno” de la relación a la tabla del lado “varios” (el lado marcado con un asterisco en la vista de modelo de Power BI).

Por ejemplo, para calcular el número de clientes que han comprado en cada país podríamos usar la siguiente medida:

Number of customers =
CALCULATE(
    COUNT(Customers[Customer Id]),
    CROSSFILTER(
        Sales[Customer Id],
        Customers[Customer Id],
        Both
    )
)

Si la llevamos a nuestra tabla, el resultado es el siguiente:

Función CROSSFILTER
Es importante que quede claro que la modificación del filtro solo se realiza durante la evaluación de la expresión indicada como primer argumento de CALCULATE. Fuera del CALCULATE el filtro sigue siendo el que hayamos definido en la vista de modelo.