Replicación de cada fila de una tabla según una tabla de valores

Otra aplicación interesante de la función GENERATE es la de replicar las filas de una tabla según ciertos valores. Por ejemplo, supongamos que tenemos una tabla de ventas ("Ventas") en las que se muestra el producto vendido y el número de unidades implicadas en cada venta:

Tabla de ventas

En múltiples circunstancias preferiríamos tener, no este tipo de listado, sino aquel en el que el item C, por ejemplo, aparezca tantas veces (en tantas filas) como unidades se han vendido (es decir, en el que aparezca tres veces en nuestro ejemplo).

Este escenario podría ser resuelto si consiguiésemos realizar una combinación cruzada entre cada una de las filas de la tabla anterior y una tabla de soporte que tuviese tantas filas como se indicase en el campo Units de Ventas (con independencia del contenido exacto que tuviese esta tabla de soporte). Es posible crear una tabla con n filas mediante la función GENERATESERIES, función que crea una tabla con una única columna de nombre Value con los valores de una progresión aritmética. Es decir, si el número de unidades del producto C -por ejemplo- es 3, la combinación cruzada de dicha fila con el resultado de GENERATESERIES(1; 3) estaría replicando la fila del producto C tres veces.

Afortunadamente ya sabemos que la función GENERATE genera un contexto de filtro para cada una de las filas de la primera tabla, lo que significa que los datos de dicha fila están a disposición de la segunda (y que, de hecho, esta segunda tabla se va a contextualizar según dicho contexto). En otras palabras, el campo Units está disponible para la segunda tabla de la función GENERATE.

Todo esto hace muy fácil conseguir el resultado buscado, pues basta con ejecutar el siguiente código para generar la tabla que queremos:

Tabla = 
    GENERATE(
        Ventas;
        GENERATESERIES(1; Ventas[Units])
    )

Tabla resultante

La función GENERATE va a recorrer cada fila de la tabla Ventas, creando el contexto de fila asociado a cada una y a realizar una combinación cruzada con todas las filas de la segunda tabla tras contextualizar esta última. La segunda tabla es el resultado de generar una progresión aritmética entre 1 y el valor del campo Units (disponible vía contexto de fila, de forma que basta con hacer referencia al nombre del campo para acceder a su contenido).

Si quisiéramos quedarnos ahora con apenas los campos Id y Product (por ejemplo), bastaría utilizar la función SELECTCOLUMNS:

Tabla = 
    SELECTCOLUMNS(
        GENERATE(
            Ventas;
            GENERATESERIES(1; Ventas[Units])
        );
        "Id"; Ventas[Id];
        "Product"; Ventas[Product]
    )

Tabla resultante con apenas los campos de interés

 

Funciones DAX involucradas
Enviado por admin el Mar, 02/07/2019 - 11:25