Algunas veces es imposible utilizar la función CALCULATE de DAX para filtrar los datos de una medida en función de dos campos o columnas diferentes sin que se produzca un error de sintaxis a nivel de fila (row level sintax error). Este tipo de condiciones en los filtros no se pueden usar con la función CALCULATE de DAX. Veamos un ejemplo:

PriceQuantity =
CALCULATE ( SUM ( Orders[Amount] ), Orders[Quantity] * 2 < Orders[Price] )

Esta medida retorna el siguiente error:

Measure ‘Orders'[PriceQuantity] : The expression contains multiple columns, but only a sigle column can be used in a True/False expression that is used as a table filter expression.

 

En los siguientes artículos analizaremos más en detalle este caso y como solucionarlo, por ahora vamos a centrarnos en los parámetros que se pasan a la función FILTER dentro de CALCULATE para modificar el filter context de la fórmula.

Hemos visto como usando la función CALCULATE, se puede modificar el contexto de filtro de la columna actual con un nuevo filtro, esto es lo que la función CALCULATE puede hacer, cambiar el filtro contexto de fila de la fórmula por otro contexto de fila. Por ejemplo, la siguiente definición de medida:

ItalyAndFrance =
CALCULATE (
    SUM ( Orders[Amount] ),
    Cities[Country] = «Italy»
        || Cities[Country] = «France»
)

Es equivalente a la siguiente:
ItalyAndFrance =
CALCULATE (
    SUM ( Orders[Amount] ),
    FILTER (
        ALL ( Cities[Country] ),
        Cities[Country] = «Italy»
            || Cities[Country] = «France»
    )
)
Es decir, la condición que filtra las ciudades de Italia o Francia, opera sobre todas los valores de la columna Country. De hecho, solo retorna un valor, sin tener en cuenta la selección del país del usuario. Para tener el cuenta la selección del usuario sin que sea obviada por la fórmula, tienes que utilizar VALUES, en lugar de ALL.
ItalyAndFrance =
CALCULATE (
    SUM ( Orders[Amount] );
    FILTER (
        VALUES ( Cities[Country] );
Cities[Country] = «Italy»
|| Cities[Country] = «France»
    )
)
VALUES retorna una tabla de una sola columna con los valores DISTINTOS de la columna, eliminando duplicados, que están activos por el actual contexto de filtro (filter context). De la misma forma, puedes cambiar la posición de la función VALUES dentro de la función CALCULATE. El resultado final, es la intersección de los dos parámetros como si fuese una condición AND.
ItalyAndFrance =
CALCULATE (
    SUM ( Orders[Amount] );
    FILTER (
        VALUES ( Cities[Country] );
        Cities[Country] = «Italy»
            || Cities[Country] = «France»
    )
)