Cálculo de las ventas totales del país al que pertenece cada ciudad

En este escenario partimos de una lista de localizaciones ("Geography") en la que se incluye el nombre de la ciudad y el país al que pertenece (entre otros datos):

Tabla de localizaciones

...y una tabla de ventas ("Movements") en la que se incluye la fecha de venta, la ciudad a la que está asociada y el importe de venta:

Tabla de ventas

Ambas tablas están relacionadas por el campo Geography Id:

Modelo de datos

El objetivo es añadir una columna calculada a la tabla de localizaciones en la que se muestren las ventas totales del país al que corresponde el registro.

Al crear la columna calculada se va a recorrer la tabla de localizaciones creándose el contexto de fila correspondiente. Podemos acceder al valor del campo Country usando la función EARLIER, de forma que podríamos seleccionar -para cada fila recorrida- el subconjunto de la tabla de localizaciones que incluye ciudades del país en cuestión. Es decir:

FILTER(
    Geography;
    Geography[Country] = EARLIER(Geography[Country])
)

...devolvería este subconjunto. A su vez, este subconjunto de ciudades nos permitiría filtrar la tabla de ventas mediante la función CALCULATETABLE, agregando como filtro el subconjunto anterior:

CALCULATETABLE(
    Movements;
    FILTER(
        Geography;
        Geography[Country] = EARLIER(Geography[Country])
    )
);

Por último, no quedaría más que recorrer esta tabla (subconjunto de la tabla de ventas) sumando el campo Sales:

Ventas del país = 
    SUMX(
        CALCULATETABLE(
            Movements;
            FILTER(
                Geography;
                Geography[Country] = EARLIER(Geography[Country])
            )
        );
        Movements[Sales]
    )

El resultado sería el siguiente:

Resultado obtenido:

Podemos confirmar que las cifras son las correctas llevando a una visualización tipo tabla la lista de países y el campo Sales de la tabla de ventas:

Ventas por país

 

DAX functions involved
Submitted by admin on Sat, 07/06/2019 - 13:19