Resolución del ejercicio

Aparentemente hemos creado de forma correcta las medidas necesarias, pero el resultado no es el que esperábamos. ¿Dónde está el problema?: En la transición de contexto. Cuando se ejecuta de manera controlada se convierte en una magnífica herramienta de cálculo. Cuando ocurre sin que seamos conscientes de ello, puede ser un problema. Recordemos el código de nuestra medida:

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

Estamos recorriendo la tabla Customers con la función FILTER, supuestamente seleccionando solo aquellos clientes que cumplen cierta condición, concretamente:

[Sales] > [Average sales per customer]

Revisemos con detalle lo que estamos comparando realmente. La tabla de clientes tiene una clave primaria (Customer Id):

Tabla Customers

lo que nos asegura que, cuando se ejecute la transición de contexto, solo quedará una fila visible en esta tabla (la fila siendo iterada).

Por otro lado, sabemos que, en contexto de fila, la referencia a una medida va a ejecutar la transición de contexto de forma automática. Esto supone que nuestra medida:

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

está ocultando una función CALCULATE para cada una de las dos medidas a las que hace referencia ([Sales] y [Average sales per customer]) y que, de hecho, podría ser rescrita de la siguiente forma:

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

Veamos entonces: cuando comienza la iteración, la función FILTER “apunta” a la primera fila y se obtienen dos valores:

  • [Sales]: Medida que está ejecutando una transición de contexto que hace que solo el cliente actual quede visible, lo que filtra la tabla de ventas. El resultado son las ventas realizadas al cliente en cuestión. Por ahora todo parece correcto.
  • [Average sales per customer]: Medida que está ejecutando una transición de contexto que hace que solo el cliente actual quede visible, lo que filtra la tabla de ventas (¡igual que antes!). Solo que, una vez que se ha filtrado el modelo de datos de esta manera, es cuando se realiza el cálculo que hay detrás de esta medida:
Average sales per customer = AVERAGEX(Customers, [Sales])

Y lo que hacemos en la expresión anterior es recorre la tabla de clientes (la tabla de clientes visibles ¡y solo hay uno: el que está siendo iterado por la función FILTER!) y se calcula el valor medio del total de sus compras. El resultado es el valor correspondiente las ventas realizadas al cliente en cuestión.

Dicho con otras palabras, tras la ejecución de las dos transiciones de contexto, lo que estamos comparando con esto:

[Sales] > [Average sales per customer]

es, en realidad, esto:

Compras del usuario siendo iterado > Compras del usuario siendo iterado

condición que, por supuesto, nunca se va a cumplir, por lo que la función FILTER devuelve una tabla vacía y la función COUNTROWS… devuelve un blank.

La pregunta aquí es ¿cómo tendríamos que rescribir la medida [# Customers buying more than average] para que devolviese el valor correcto?

La solución en la siguiente página…