Continuación de la resolución del ejercicio

Recordemos el aspecto de nuestra medida:

# Customers buying more than average = 
COUNTROWS (
    FILTER (
        Customers,
        [Sales] > [Average sales per customer]
    )
)

Hemos visto que la referencia a la medida [Sales] devuelve el valor correcto (las ventas de cada cliente) y que el problema está en la referencia a la medida [Average sales per customer], que también se evalúa tras una transición de contexto que nos estropea el resultado final. Lo que querríamos sería que no se ejecutase la transición de contexto, o que, si se ejecuta, incluya a todos los clientes ¿Y cómo puede lograrse esto? De un par de formas:

La más sencilla es obtener el valor de [Average sales per customer] fuera del contexto de fila provocado por la función FILTER. Por ejemplo, en una variable:

# Customers buying more than average = 
VAR __avgSales = [Average sales per customer]
RETURN
    COUNTROWS (
        FILTER (
            Customers,
            [Sales] > __avgSales
        )
    )

Ahora, la medida [Average sales per customer] se va a evaluar en contexto de filtro (que es el contexto por defecto cuando creamos medidas) y va a incluir, por lo tanto, a todos los clientes visibles (obviamente, si estamos filtrando los clientes, por ejemplo, mediante una segmentación, los clientes visibles no serán todos los clientes).

Si llevamos esta medida a una tarjeta veremos el resultado correcto:

# Customers buying more than average

Otra forma de obtener el mismo resultado sería invocar la medida [Average sales per customer] asegurándonos de que el filtrado de la tabla Customers no se aplica a un único cliente (el siendo iterado), sino a todos los clientes, lo que podemos conseguir con la función CALCULATE e incluyendo como filtro la expresión ALL(Customers):

# Customers buying more than average = 
COUNTROWS (
    FILTER (
        Customers,
        [Sales] > 
        CALCULATE(
            [Average sales per customer],
            ALL(Customers)
        )
    )
)