Suma de los valores máximos de cada categoría

En este escenario partimos de una tabla de hechos ("Data") en la que cada registro tiene asignado una categoría:

Datos de partida

El objetivo es calcular el valor máximo de cada categoría (7 para la categoría A, 3 para B y 8 para C) y sumarlos (18 en este caso).

La resolución de este escenario incluye dos pasos:

1. En el primero deberemos calcular el valor máximo de cada categoría para llegar a una tabla intermedia semejante a la siguiente:

Tabla intermedia con los valores máximos por categoría

2. En el segundo deberemos recorrer la tabla intermedia generada sumando los valores encontrados.

1er paso

Para crear esta tabla intermedia podemos recurrir tanto a la función SUMMARIZE como a SUMMARIZECOLUMNS o GROUPBY. Veamos los tres casos:

SUMMARIZE

El código sería el siguiente:

Max value per category summarize =

    SUMMARIZE(

        Data;

        Data[Category];

        "Max value"; MAX(Data[Value])

    )

Básicamente estaríamos agregando el campo Category de la tabla Data para crear el campo "Max value" calculando el valor máximo del campo Data[Value] con la función MAX una vez filtrado:

Cálculo de la tabla intermedia con la función SUMMARIZE

SUMMARIZECOLUMNS

En este segundo caso el código sería el siguiente:

Max value per category summarizecolumns =

    SUMMARIZECOLUMNS(

    Data[Category];

    "Max value";

    MAX(Data[Value])

)

Cálculo de la tabla intermedia con la función SUMMARIZECOLUMNS

Estamos agregando el campo Data[Category] y creando el nuevo campo "Max value" calculando el valor máximo del campo Data[Value] una vez filtrado, también con la función MAX.

GROUPBY

Por último, utilizando la función GROUPBY el código quedaría de la siguiente forma:

Max value per category groupby =

GROUPBY(

    Data;

    Data[Category];

    "Max value"; MAXX(CURRENTGROUP(); Data[Value])

    )

En este caso estamos agrupando la tabla Data según la columna Data[Category] y generando la columna "Max value" utilizando la función iterativa MAXX

Cálculo de la tabla intermedia con la función GROUPBY

2º paso

Una vez conseguida la tabla anterior usando cualquiera de los tres métodos (supongamos que usando la función GROUPBY), tendremos que volver a agregar la tabla sumando los valores de la columna "Max value". En este paso, al contrario que en el paso anterior, no todas las funciones mencionadas servirían. Veámoslas una a una:

SUMMARIZE

El código para esta primera función sería el siguiente:

Sum of max value per category = 
    SUMMARIZE(
        'Max value per category groupby';
        "Max"; SUM('Max value per category groupby'[Max value])
    )

Es decir, estaríamos agregando la tabla intermedia creada, Max value per category groupby, sin especificar el campo de agregación (pues no queremos más que la suma) y el nuevo campo a crear, Max, como la suma de los valores. El resultado sería el mostrado en la siguiente imagen:

Cálculo del resultado final con la función SUMMARIZE

Al no haber especificado el campo de agregación, DAX agrega todos los valores numéricos.

Obsérvese, en todo caso, que con esta función, SUMMARIZE, no sería posible crear la tabla intermedia y realizar la agregación en una única expresión DAX, pues la función SUMMARIZE devuelve un error ("se espera una tabla de base")

SUMMARIZECOLUMNS

Con esta función, el código sería el siguiente:

Sum of max value per category = 
    SUMMARIZECOLUMNS(
        "Max"; SUM('Max value per category groupby'[Max value])
    )

Estamos agregando la tabla intermedia creada, nuevamente sin especificar el campo de agregación, y creando el campo Max como la suma del campo Max value de la tabla intermedia. El resultado es el siguiente:

Cálculo del resultado final con la función SUMMARIZECOLUMNS

Al igual que ocurre con SUMMARIZE, el intento de aplicar la función SUMMARIZECOLUMNS a una tabla intermedia creada en la misma expresión DAX devolvería un error.

GROUPBY

En este último caso, el código sería el siguiente:

Sum of max value per category = 
    VAR Max_value_per_category =
        GROUPBY(
            Data;
            Data[Category];
            "Max value"; MAXX(CURRENTGROUP(); Data[Value])
        )
    RETURN
        GROUPBY(
            Max_value_per_category;
            "Sum"; SUMX(CURRENTGROUP(); [Max value])
        )

Estaríamos simplemente agregando la tabla intermedia generando como resultado la suma de los valores Max value de forma iterativa. El resultado es el siguiente:

Cálculo del resultado final con la función GROUPBY

En este tercer caso, sí es posible crear la tabla intermedia en la misma expresión DAX, lo que hace de esta función la más adecuada para este escenario.

Funciones DAX involucradas
Enviado por admin el Mar, 08/01/2019 - 19:19