Cálculo de las ventas medias por mes

Supongamos que tenemos información sobre ventas (tabla Sales en nuestro caso) y queremos calcular el valor medio mensual de éstas. Es decir, si fuesen tres meses y las ventas totales para cada mes hubiesen sido 10, 20 y 18, querríamos obtener como resultado (10 + 20 + 18) / 3 = 16.

Esto supone obtener un valor parcial para cada mes y calcular el valor medio de los resultados obtenidos, lo que nos invita a utilizar la función AVERAGEX. En pseudo-código nuestra medida sería la siguiente:

Avg Monthly sales = 
AVERAGEX(
    Tabla de meses,
    ventas para cada mes
)

Para la generación de la tabla a iterar (la tabla de meses) resulta más que conveniente la existencia en el calendario de una columna que combine información del año y del número de mes, pues esto permitirá identificar de forma unívoca a cada uno de los meses que vamos a iterar.

Campo year_month

El acceso a esta columna supone que:

VALUES('Calendar'[year_month])

va a devolver una tabla formada por los valores distintos de dicha columna. O, en otras palabras, los meses visibles del calendario (distinguiendo, por ejemplo, enero de 2015 de enero de 2016). Podemos ver el resultado creando una tabla calculada con el siguiente código:

year_month = VALUES('Calendar'[year_month])
Campo year_month

Vemos que la tabla resultante contiene todos los valores distintos de la columna en cuestión:

Nuestra medida, por lo tanto, tendrá el siguiente aspecto (todavía parcialmente escrita en pseudo-código):

Avg Monthly sales = 
AVERAGEX(
    VALUES('Calendar'[year_month]),
    ventas para cada mes
)

La función AVERAGEX va a recorrer cada uno de estos valores (“201501”, “201502”, etc.) y, en cada iteración, en el calendario se marcarán como visibles todas las filas en las que el campo 'Calendar'[year_month] tome el valor que se esté iterando. Por ejemplo, en la primera iteración de nuestra medida se considerará el valor “201501”, lo que hará que los 31 días del calendario que contienen este valor en la columna 'Calendar'[year_month] se marquen como visibles: el mes de enero de 2015.

Ahora querríamos calcular las ventas de este mes. Si forzamos una transición de contexto, las 31 filas visibles se van a propagar al resto del modelo de datos de forma tal que en Sales solo las ventas ocurridas en enero de 2015 quedarán visibles (y la suma del campo Sales[Amount] nos devolverá el valor buscado: las ventas del mes siendo iterado). Para ejecutar la transición de contexto ya sabemos que podemos usar la función CALCULATE o hacer referencia a una medida ya existente. Es decir, serviría tanto

Avg Monthly sales = 
AVERAGEX(
    VALUES('Calendar'[year_month]),
    CALCULATE(
        SUM(Sales[Amount])
    )
)

como

Avg Monthly sales = 
AVERAGEX(
    VALUES('Calendar'[year_month]),
    [Sales]
)

Si llevamos esta medida a una tarjeta veremos el resultado:

Avg Monthly sales

En general, este patrón se resume de la siguiente forma:

Medida = 
FunciónX(
    VALUES(columna),
    expresión
)