Nombre del producto más vendido

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:

Cifra de ventas totales correspondiente al producto más vendido

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:

Nombre del producto con mayores ventas totales

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:

Listado ordenado de productos por sus ventas totales

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()

            )

)

Código alternativo usando la función LASTNONBLANK

 

DAX functions involved
Submitted by admin on Tue, 01/15/2019 - 15:14