Usar funciones iteradoras

Completado

Las funciones iteradoras evalúan una expresión para las filas de una tabla. Le aportan flexibilidad y control sobre cómo el modelo resume los datos.

Las funciones de resumen de una sola columna, como SUM, COUNT, MIN y MAX, tienen funciones iteradoras equivalentes con un sufijo "X", como SUMX, COUNTX, MINX y MAXX. También existen funciones iteradoras especializadas para filtrar, clasificar y realizar cálculos semiaditivos a lo largo del tiempo.

Cada función iteradora requiere una tabla y una expresión. La tabla puede ser una tabla modelo o cualquier expresión que devuelva una tabla. La expresión debe devolver un único valor por cada fila.

Las funciones de resumen de una sola columna, como SUM, actúan como una función abreviada. Power BI convierte internamente SUM a SUMX. Por ejemplo, las dos medidas siguientes devuelven el mismo resultado y tienen el mismo rendimiento:

Revenue = SUM(Sales[Sales Amount])
Revenue =
SUMX(
    Sales,
    Sales[Sales Amount]
)

Las funciones iteradoras evalúan la expresión de cada fila de una tabla utilizando el contexto de fila, lo que significa que procesan una fila a la vez para calcular el resultado final. Luego, la tabla se evalúa en el contexto de filtro. Por ejemplo, si un objeto visual de informe filtra por el ejercicio 2020, la tabla Sales solo contendrá las filas de ventas de ese año.

Importante

El uso de funciones iteradoras con tablas grandes y expresiones complejas puede ralentizar el rendimiento. Funciones como SEARCH y LOOKUPVALUE pueden ser caras. Cuando sea posible, utilice RELATED para obtener un mejor rendimiento.

Funciones iteradoras para resúmenes complejos

Las funciones iteradoras le permiten añadir más de una columna. Por ejemplo, una medida de ingresos puede multiplicar la cantidad del pedido, el precio unitario y un factor de descuento para cada fila y, luego, sumar los resultados.

Revenue =
SUMX(
    Sales,
    Sales[Order Quantity] * Sales[Unit Price] * (1 - Sales[Unit Price Discount Pct])
)

Las funciones iteradoras también pueden hacer referencia a tablas relacionadas. La medida de descuento puede usar la función RELATED para acceder al precio de lista desde la tabla de productos.

Discount =
SUMX(
    Sales,
    Sales[Order Quantity]
    * (
        RELATED('Product'[List Price]) - Sales[Unit Price]
    )
)

En la siguiente imagen, se muestra un objeto visual de tabla con las columnas Month, Revenue y Discount. Revenue y Discount son las medidas creadas anteriormente.

Captura de pantalla de un objeto visual de tabla con tres columnas: Month, Revenue y Discount

Funciones iteradoras para lograr un resumen con un mayor intervalo de agregación

Las funciones iteradoras también pueden resumir datos en diferentes niveles de detalle (intervalo de agregación). Por ejemplo, es posible que desee calcular un promedio en el nivel de artículo de línea o en el nivel de pedido de ventas.

En este ejemplo, la tabla Sales contiene una fila para cada elemento de línea en un pedido de ventas. Cada fila incluye detalles como el número de pedido de ventas, el producto, la cantidad vendida, el precio unitario y el descuento. Es posible que varias filas tengan el mismo número de pedido de ventas, lo que representa diferentes artículos dentro del mismo pedido.

Para calcular los ingresos medios por línea de pedido (elemento de línea), puede utilizar la función AVERAGEX para iterar sobre cada una de las filas de la tabla Sales. La fórmula calcula los ingresos de cada artículo de línea y, a continuación, promedia el resultado en todos los elementos de línea en el contexto de filtro actual:

Revenue Avg Order Line =
AVERAGEX(
    Sales,
    Sales[Order Quantity] * Sales[Unit Price] * (1 - Sales[Unit Price Discount Pct])
)

Captura de pantalla de un objeto visual de tabla con cuatro columnas: Month, Revenue, Discount y Revenue Avg

Si desea calcular los ingresos promedio por pedido de ventas (en lugar de por elemento de línea), puede usar la función VALUES para obtener primero una lista de números de pedidos de ventas únicos. A continuación, AVERAGEX itera sobre cada pedido de ventas y promedia los ingresos totales de cada pedido:

Revenue Avg Order =
AVERAGEX(
    VALUES('Sales Order'[Sales Order]),
    [Revenue]
)

La función VALUES devuelve los pedidos de venta únicos según el contexto de filtro actual, por lo que AVERAGEX itera cada pedido de venta de cada mes.

Captura de pantalla de un objeto visual de tabla con cinco columnas: Month, Revenue, Discount, Revenue Avg Order Line y Revenue Avg Order

Clasificación con funciones iteradoras

La función RANKX calcula los rangos iterando sobre una tabla y evaluando una expresión para cada fila.

La dirección del pedido puede ser ascendente o descendente. La clasificación de los ingresos generalmente utiliza el orden descendente, por lo que el valor más alto ocupa el primer lugar. La clasificación de algo como las quejas puede usar el orden ascendente, por lo que el valor más bajo se clasifica primero. De forma predeterminada, RANKX utiliza el orden descendente y omite los rangos para los empates.

Por ejemplo, una medida de clasificación de cantidad de productos puede usar RANKX y la función ALL para clasificar productos por cantidad:

Product Quantity Rank =
RANKX(
    ALL('Product'[Product]),
    [Quantity]
)

La función ALL elimina los filtros, por lo que RANKX clasifica todos los productos. En la siguiente imagen, dos productos empatan en el décimo lugar, por lo que el siguiente producto ocupa el duodécimo lugar y se omite el rango 11.

Captura de pantalla de un objeto visual de tabla con dos productos empatados, tal y como se ha descrito

También puede usar la clasificación densa, que asigna el siguiente rango después de un empate sin omitir números. Para usar una clasificación densa, la medida puede incluir el argumento DENSE:

Product Quantity Rank =
RANKX(
    ALL('Product'[Product]),
    [Quantity],
    ,
    ,
    DENSE
)

Ahora, después de que dos productos empaten en el décimo lugar, el siguiente producto se ubica en el undécimo lugar y la numeración continúa secuencialmente sin saltarse la posición 11.

Captura de pantalla con la tabla descrita con el rango DENSE

En este objeto visual, la fila de totales de la medida Product Quantity Rank muestra uno, porque el total de todos los productos también está clasificado y solo hay un valor.

Captura de pantalla donde se ve que el total de Product Quantity Rank es 1

Para evitar la clasificación del total, la medida puede utilizar la función HASONEVALUE para devolver BLANK, a menos que se filtre un solo producto.

Product Quantity Rank =
IF(
    HASONEVALUE('Product'[Product]),
    RANKX(
        ALL('Product'[Product]),
        [Quantity],
        ,
        ,
        DENSE
    )
)

Ahora, el total para Product Quantity Rank será BLANK.

Captura de pantalla donde se ve que el total de Product Quantity Rank es BLANK

La función HASONEVALUE comprueba si la columna del producto tiene un valor único en el contexto del filtro. Esto es válido para cada grupo de productos, pero no para el total, que representa todos los productos.

Las funciones iteradoras proporcionan formas eficaces de resumir, añadir y clasificar datos en modelos de Power BI. Admiten cálculos complejos y le permiten controlar el nivel de detalle de sus informes.