Función MAXX en DAX y Sus 4 Propiedades.
Este artículo hablaremos de la función MAXX, una de las 19 funciones de iteración escalares en el lenguaje DAX, adicionalmente brindaremos ejemplos para sus dos parámetros.
— TABLA DE CONTENIDO DE ESTE ARTÍCULO
1. Generalidades de la función MAXX en DAX
a. Descripción
b. Sintaxis
2. 4 Propiedades de MAXX
a. Primer parámetro es versátil
b. Seguna expresión una expresión a ejecutar fila a fila
c. Ignora valores null
d. No admite valores TRUE/FALSE
El presente artículo se creo a partir de la ficha técnica de la función: MAXX; Dragón Oscuro del Valor Superior.
Generalidades de la Función MAXX en DAX
Primor, lo básico:
Descripción de MAXX
Retorna el valor más grande de todos los valores parciales que «salieron» como resultado de una expresión que se evalúa fila a fila en una tabla.
Sintaxis de MAXX
Al igual que todas las funciones de iteración, MAXX sigue la misma anatomía general:
(1) → Tabla: Puede ser algo tan sencillo como el nombre de una tabla, o algo más elaborado mediante una expresión tabular.
• Tipo: Obligatorio
• Atributo: No Repetible
(2) → Expresión: Una expresión: aritmética o algebraica para ser evaluada en una base fila a fila.
• Tipo: Obligatorio
• Atributo: No Repetible
Retorna el valor máximo de todos los valores calculados individuamente fila por fila en la tabla, puede ser de cualquier tipo.
Observaciones de la Función MAXX
La función TREATAS es empleada en 4 ramas: Creación de filtros arbitrarios, Optimización de medidas semi aditivas, Propagación de filtros para relaciones virtuales y cómo Parámetro de filtro en SUMMARIZECOLUMNS, esto no condiciona que sean las únicas aplicaciones, pero si las más comunes.
El Primer Parámetro es Versátil
El primer parámetro es versátil, puesto que, como primera posibilidad puede aceptar simplemente la llamada de una tabla en el modelo:
ValorVentaMáxima :=
MAXX ( Pedidos; Pedidos[Ingresos] )
Como segunda posibilidad es licito indicar cosas más interesantes mediante expresiones tabulares.
— Ejemplo 1 – Expresión Tabular con FILTER
Si necesitamos elaborar una expresión que devuelve el valor de la venta máxima, pero sin tener en cuenta fines de semana, podemos sostenernos en el hecho de que en el primer parámetro de MAXX podemos suministrar una tabla que ya está restringida sólo para los días de lunes a viernes, con la cual, la siguiente expresión, tendremos una opción:
ValorMayorVentaNoFDS :=
MAXX (
FILTER ( Pedidos; NOT ( RELATED ( Calendario[DS Número] ) IN { 6; 7 } ) );
Pedidos[Ingresos])
La expresión tabular del primer parámetro puede ser tan compleja como necesitemos.
— Ejemplo – Expresión Tabular con SUMMARIZE
En ciertos cálculos es necesario mostrarlo agregado por un tamaño de grano más fino que el presentado por el reporte, un ejemplo especifico, exponer en un reporte para un año determinado a nivel de meses el valor del día con mayores ingresos. Una posible solución:
ValorDiaMayorVenta :=
MAXX (
ADDCOLUMNS (
SUMMARIZE ( Pedidos; Calendario[Día] );
«@Ingresos Totales»; [Ing] );
[@Ingresos Totales])
Detente, Un inciso:
La medida ValorDiaMayorVenta es diferente a:
ValorVentaMáxima :=
MAX ( Pedidos[Ingresos] )
Por el hecho de que la medida ValorVentaMáxima devuelve el valor más grande de las transacciones discriminando cada una como diferente, mientras que la medida ValorDiaMayorVenta devuelve el valor más grande del agregado (en este caso suma) de las transacciones, que resulta ser a nivel de día.
Espera, Otro inciso:
Si hay varios años seleccionados, la medida ValorDiaMayorVenta retornaría el valor mayor de la suma de los ingresos del mismo día en los años seleccionados. El motivo, se está agrupando por un campo que no tiene valores únicos, con lo cual, si se desea el valor mayor del día con mayores ventas para un año especificado basta con agrupar por un campo con valores únicos, así:
ValorDiaMayorVenta :=
MAXX (
ADDCOLUMNS (
SUMMARIZE ( Pedidos; Calendario[Fecha] );
«@Ingresos Totales»; [Ing] );
[@Ingresos Totales])
Adelante:
Existe una manera de escribir la expresión anterior para una medida de una forma mucha más compacta y elegante, sin embargo, para ello primero debemos dejar estudiar el principio a continuación:
El Segundo Parámetro Indica una expresión a ser ejecutada fila a fila
Esta expresión pude ser algo tan sencillo cómo llamar a un campo en el modelo de datos:
• Ejemplo:
ValorVentaMáxima :=
MAX ( Pedidos; Pedidos[Ingresos] )
La medida anterior es la versión larga de: MAX(Pedidos[Ingresos]) , es decir, esta última es sólo una sytax sugar de la expresión más larga y completa: MAXX (Pedidos ; Pedidos[Ingresos]), por lo anterior, vemos que cobra mayor utilidad implementar la función MAXX cuando él segundo parámetro involucra varias columnas a operar, por ejemplo:
• Ejemplo:
MayorCostoTotal :=
MAX (
Pedidos;
Pedidos[Costo Producto] + Pedidos[Costo Empaque] + Pedidos[Costo Envió])
Incluso podemos involucrar funciones, ejemplo:
MayorCostoTotalComoMáximoEntero :=
MAX (
Pedidos;
ROUNDUP ( Pedidos[Costo Producto]; 0 ) + ROUNDUP ( Pedidos[Costo Empaque]; 0 )
+ ROUNDUP ( Pedidos[Costo Envió]; 0 )
)
Esta capacidad de llamar funciones nos brinda una habilidad potente cuando se involucra la función CALCULATE, puesto que podemos emplear la operación de transición de contextos para añadir los valores de la iteración actual como filtros o restricciones a la tabla correspondiente en el modelo de datos.
• Ejemplo:
Si recordamos nuestro escenario en el cual buscábamos exponer en un reporte para un año determinado a nivel de meses el valor del día con mayores ingresos, entonces, una solución más elegante que además permite seleccionar varios años es como sigue:
ValorDiaMayorVenta :=
MAXX ( Pedidos; CALCULATE ( SUM ( Pedidos[Ingresos] ) ) )
Y gracias al CALCULATE implícito que se añade cuando hacemos referencia a una medida, podemos escribir la expresión aún más compacta, así:
ValorDiaMayorVenta :=
MAX ( Pedidos; [Ing] )
— La medida [Ing] es:
— SUM ( Pedidos[Ingresos] )
La Función MAXX ignora la existencia de valores null
La función MAXX ignora la existencia de valores null, tomados como vacío (BLANK) por el motor DAX, realizando la determinación de valor superior exclusivamente sobre el conjunto de valores estricta y visualmente numéricos.
Por esta consideración, si la distribución de la columna o del resultado de la expresión ejecutada fila a fila tiene valores vacíos que deben ser leídos como 0, entonces, se debe asignar el valor explícitamente.
La función MAAX no admite valores TRUE/FALSE
La función MAXX no admite valores de tipo TRUE/FALSE en el resultado de la expresión ejecutada fila a fila, por lo tanto, aplicar lógica booleana de forma directa para resolver el ejemplo anterior no es valido
• Ejemplo:
MaxERROR :=
MAXX (
Pedidos;
NOT ISBLANK ( Pedidos[Ingresos] ) * VALUE ( Pedidos[Ingresos] )
)
— Error: La función no admite valores booleanos
Aunque con funciones como CONVERT se puede lograr, esto hace más enrevesado e ineficiente el proceso.
Hasta la próxima
– Miguel