Calcular el importe total de ventas para el producto más vendido es relativamente fácil. Si el campo que contiene los nombres de los productos es 'Product'[ProductName] y la medida [Total sales] suma el campo correspondiente al importe de ventas, bastaría con crear la siguiente medida:
max_sales = MAXX(VALUES('Product'[ProductName]); [Total sales])
Básicamente estamos extrayendo los nombres de los productos con la función VALUES, calculando las ventas totales para cada uno de ellos y quedándonos con el mayor valor utilizando la función MAXX:
Sin embargo, extraer el nombre del producto correspondiente a dicha cifra no es tan sencillo. Una estrategia -una vez que sabemos cuál es su cifra de ventas- sería recorrer la lista de nombres de productos, calcular su cifra de ventas, compararla con el valor máximo ya conocido y devolver el nombre si la cifra calculada coincide. En pseudo-código, sería algo así:
max_sales = valor de ventas para el producto más vendido
Para cada nombre de producto:
sales = valor de ventas
si sales = max_sales:
return nombre de producto
Una forma de devolver solo el nombre de producto de interés es recorrer el listado de nombres de producto, comparar su cifra de ventas con la cifra máxima ya calculada y devolviendo un valor no vacío si coinciden y un BLANK() si no coinciden, y usar a continuación la función iteractiva FIRSTNONBLANK que extrae el nombre del producto correspondiente al primer (y único en este ejemplo) valor no vacío. En pseudo-código sería:
max_sales = valor de ventas para el producto más vendido
return
FIRSTNONBLANK(
Para cada nombre de producto
sales = valor de ventas
si sales = max_sales:
return cualquier valor no vacío
else:
return BLANK()
)
Es decir, podemos verlo como si estuviésemos generando una tabla temporal de una única columna en la que todos los valores serían blank salvo el correspondiente al producto para el que se cumpliese la condición sales = max_sales (es decir, al producto más vendido). El código anterior en DAX quedaría de la siguiente forma:
Max sales product =
VAR
max_sales = MAXX(VALUES('Product'[ProductName]); [Total sales])
RETURN
FIRSTNONBLANK(
'Product'[ProductName];
IF(
[Total sales] = max_sales ;
1;
BLANK()
)
)
Comenzamos calculando el valor máximo de ventas (max_sales) y devolviendo el nombre del producto correspondiente al primer (y único) valor no vacío de una imaginaria tabla intermedia, tabla que creamos a partir de la columna conteniendo los nombres de los productos en la que "sustituímos" el nombre del producto más vendido por un 1 (podría ser cualquier otro valor) y el resto de nombres de productos por un blank utilizando la función IF:
Para confirmar que el resultado es correcto podemos crear una visualización con la lista de productos y sus ventas totales, y ordenar dicha tabla según la cifra de ventas:
Como la "tabla temporal" solo contiene un único valor no vacío, también podríamos haber utilizado la función LASTNONBLANK:
Max sales product =
VAR
max_sales = MAXX(VALUES('Product'[ProductName]); [Total sales])
RETURN
LASTNONBLANK(
'Product'[ProductName];
IF(
[Total sales] = max_sales ;
1;
BLANK()
)
)