La función CROSSFILTER especifica la dirección del filtro a usar en la evaluación de una expresión DAX que involucra datos de dos tablas relacionadas.
CROSSFILTER(
columnName1,
columnName2,
direction
)
- columnName1: Nombre de la columna que determina la relación en la primera tabla.
- columnName2: Nombre de la columna que determina la relación en la segunda tabla.
- direction: Dirección del filtro a aplicar.
La función CROSSFILTER no devuelve ningún valor.
El valor del argumento direction puede ser:
- one o 1: El filtro de la tabla correspondiente a "uno" (de la relación uno a varios) filtra la tabla correspondiente a "varios".
- both o 2: Ambos filtros se aplican en la relación.
- none o 0: No se aplican filtros en la relación.
En el caso de una relación "uno a uno", no hay diferencias entre el tipo one y el both.
CROSSFILTER solo puede usarse en funciones que aceptan como argumento un filtro. Por ejemplo:
- CALCULATE
- CALCULATETABLE
- OPENINGBALANCEMONTH
- OPENINGBALANCEQUARTER
- OPENINGBALANCEYEAR
- CLOSINGBALANCEMONTH
- CLOSINGBALANCEQUARTER
- CLOSINGBALANCEYEAR
- TOTALMTD
- TOTALQTD
- TOTALYTD
La función utiliza relaciones que ya hayan sido definidas. Si alguna de las columnas incluidas como argumento no es parte de una relación, la función devuelve un error.
La función CROSSFILTER fija una dirección para la relación con independencia de la configuración que se haya aplicado a la relación en la vista del modelo.
En el caso de que se aniden funciones CALCULATE y más de una contenga una función CROSSFILTER, se impondrá la más interior en caso de conflicto o ambigüedad.
En el siguiente modelo:
...es posible calcular el número de ventas por año, pues el filtro entre la tabla Calendar y Sales está dirigido de esta misma forma (de Calendar a Sales en una relación de uno a varios):
También podríamos calcular el número de ventas por producto pues, nuevamente, entre la tabla Products y Sales hay una relación de uno a varios en la que el filtro fluye en este sentido:
Sin embargo, no sería posible calcular el número de productos vendidos por año (o en alguna otra unidad de tiempo):
En la imagen anterior vemos cómo se ha llevado el campo Date del calendario a una matriz junto al recuento del campo Product Id, lo que esperaríamos que devolviese el número de productos distintos vendidos por unidad de tiempo. Sin embargo, el cálculo devuelve el valor 198 en todos los casos (cifra igual al total de productos vendidos en todo el período).
Para solucionar esto podemos hacer dos cosas: 1) Modificar la relación existente entre las tablas Sales y Products para que ofrezca un filtrado en las dos direcciones, o 2) realizar el recuento del campo Product Id usando una función CALCULATE en la que se añada como argumento la función CROSSFILTER especificando que el filtrado deberá ser en ambos sentidos. Veamos esta última opción. Definimos la siguiente medida:
Number of Products =
CALCULATE(
DISTINCTCOUNT(Products[Product Id]),
CROSSFILTER(Products[Product Id], Sales[Product Id], both)
)
Como argumentos de la función CROSSFILTER indicamos los campos que limitan la relación en ambas tablas y la dirección deseada en la relación ("both"). Llevamos esta medida a la matriz anterior:
Ahora el cálculo se realiza de forma correcta.