Skip to main content
cancel
Showing results for 
Search instead for 
Did you mean: 

Register now to learn Fabric in free live sessions led by the best Microsoft experts. From Apr 16 to May 9, in English and Spanish.

Reply
Syndicate_Admin
Administrator
Administrator

Convertir una tabla con un rango de valores enteros, en una nueva tabla con una fila para cada valor

Tengo una situación en la que estoy usando Microsoft Power BI. Tengo una tabla de origen (llamada Couriers), con una gama de pesos (MinWeight a MaxWeight) para cualquier combinación dada de Courier y Country, junto con el valor freight.

src11.GIF

Necesito desarrollar una nueva TABLA (llamada Couriers_FlattenedData) en Power BI , en la que, obteré una fila para cada valor entre MinWeight y MaxWeight.

src22.GIF

Por ejemplo, si el peso mínimo al peso máximo se lee como 0 y 5 para FedEx Australia, necesito 5 filas de 1 a 5.

Necesito estas 4 columnas en la nueva tabla de Couriers_FlattenedData - Courier, Country, Weight, Freight. La columna Peso se convierte en filas en función del intervalo de la tabla de origen.

Estoy tratando de derivar la nueva tabla, tanto en DAX como en el Editor de consultas de potencia de back-end (mediante el lenguaje M). Me gustaría tener las dos maneras de desarrollar esta nueva mesa. Intenté algo como esto en DAX, pero no pude conseguir una solución.

Couriers_FlattenedData = SELECTCOLUMNS (

GENERAR (

'Mensajeros', GENERATESERIES (

CALCULATE(DISTINCT(Couriers[MinWeight])+1),

CALCULATE(DISTINCT(Couriers[MaxWeight]))

)

),

"Courier", Couriers[Courier],

"País", Mensajeros[País],

"Carga", Mensajeros[Carga]

)

¿Puede alguien corregir la expresión DAX anterior, que se pierde la columna Peso? ¿O incluso proporcionar una solución usando variables?

¿Y también una solución paso a paso con el Editor de consultas de energía de Power BI?

2 ACCEPTED SOLUTIONS
Syndicate_Admin
Administrator
Administrator

No @snph1777

Estas son algunas sugerencias:

Versión DAX:

Tenga en cuenta que GENERATE recorre en iteración las filas de Couriers, por lo que el segundo argumento de GENERATE se evalúa en el contexto de fila de Couriers y puede hacer referencia directamente a columnas de Couriers sin agregación.

Couriers_FlattenedData =
SELECTCOLUMNS (
    GENERATE (
        Couriers,
        GENERATESERIES ( Couriers[MinWeight] + 1, Couriers[MaxWeight] )
    ),
    "Courier", Couriers[Courier],
    "Country", Couriers[Country],
    "Weight", [Value],
    "Freight", Couriers[Freight]
)

Versión de power query:

Nota: Utilicé Table.CombineColumns, ya que elimina muy bien las columnas que se combinan y las reemplaza por la nueva columna. También puede usar Table.AddColumn y, a continuación, quitar MinWeight/MaxWeight después de eso.

let
    Source = Couriers,
    WeightList = Table.CombineColumns(Source,{"MinWeight", "MaxWeight"},each {_{0}+1.._{1}},"Weight"),
    ExpandWeightList = Table.ExpandListColumn(WeightList, "Weight"),
    ChangedType = Table.TransformColumnTypes(ExpandWeightList,{{"Weight", Int64.Type}})
in
    ChangedType

saludos

Owen

View solution in original post

De nada 🙂
Claro que podemos cambiar el incremento a 0,01.

La estructura del código es bastante similar. He adjuntado un PBIX como referencia.

Versión DAX:

Con la versión DAX, necesitamos agregar un tercer argumento a GENERATESERIES. Asegúrese de que la columna Peso se establece como un tipo "Número decimal" y tiene el formato para mostrar las posiciones decimales.

Couriers_FlattenedData = 
VAR Increment = 0.01
RETURN
    SELECTCOLUMNS (
        GENERATE (
            Couriers,
            GENERATESERIES ( Couriers[MinWeight] + Increment, Couriers[MaxWeight], Increment )
        ),
        "Courier", Couriers[Courier],
        "Country", Couriers[Country],
        "Weight", [Value],
        "Freight", Couriers[Freight]
    )

Versión de power query:

Con la versión de Power Query, ahora necesitamos usar List.Numbers para crear la lista con un incremento distinto de 1, y también asegurarnos de que la columna Peso es el número de tipo.

let
    Increment = 0.01,
    Source = Couriers,
    WeightList =
      Table.CombineColumns( Source, {"MinWeight", "MaxWeight"},
        each let MinWeight = _{0}, MaxWeight = _{1}, Count = (MaxWeight-MinWeight)/Increment
        in List.Numbers(MinWeight+Increment, Count, Increment),
        "Weight"
      ),
    ExpandWeightList = Table.ExpandListColumn(WeightList, "Weight"),
    ChangedType = Table.TransformColumnTypes(ExpandWeightList,{{"Weight", type number}})
in
    ChangedType

saludos

Owen

View solution in original post

7 REPLIES 7
Syndicate_Admin
Administrator
Administrator

No @snph1777

Estas son algunas sugerencias:

Versión DAX:

Tenga en cuenta que GENERATE recorre en iteración las filas de Couriers, por lo que el segundo argumento de GENERATE se evalúa en el contexto de fila de Couriers y puede hacer referencia directamente a columnas de Couriers sin agregación.

Couriers_FlattenedData =
SELECTCOLUMNS (
    GENERATE (
        Couriers,
        GENERATESERIES ( Couriers[MinWeight] + 1, Couriers[MaxWeight] )
    ),
    "Courier", Couriers[Courier],
    "Country", Couriers[Country],
    "Weight", [Value],
    "Freight", Couriers[Freight]
)

Versión de power query:

Nota: Utilicé Table.CombineColumns, ya que elimina muy bien las columnas que se combinan y las reemplaza por la nueva columna. También puede usar Table.AddColumn y, a continuación, quitar MinWeight/MaxWeight después de eso.

let
    Source = Couriers,
    WeightList = Table.CombineColumns(Source,{"MinWeight", "MaxWeight"},each {_{0}+1.._{1}},"Weight"),
    ExpandWeightList = Table.ExpandListColumn(WeightList, "Weight"),
    ChangedType = Table.TransformColumnTypes(ExpandWeightList,{{"Weight", Int64.Type}})
in
    ChangedType

saludos

Owen

@OwenAuger

Hola Owen, Gracias por su ayuda. ¿Puede ayudarme a desarrollar la tabla en DAX y el Editor de consultas, utilizando un valor de incremento de 0,01, en lugar de 1 como he hecho en mi pregunta original?

Por ejemplo, para FedEx Austrlia, en lugar del peso 1 a 5 con un valor de flete de 3, necesito valores de peso, 1,01, 1,02, 1,03,...2,00,...5,00, todos con un valor de flete de 3. Intenté cambiar generateseries con un valor de incremento de 0,01, pero no estoy obteniendo la salida deseada. Tal vez porque el GENERATESERIES está dentro de GENERATE y SELECTCOLUMNS

De nada 🙂
Claro que podemos cambiar el incremento a 0,01.

La estructura del código es bastante similar. He adjuntado un PBIX como referencia.

Versión DAX:

Con la versión DAX, necesitamos agregar un tercer argumento a GENERATESERIES. Asegúrese de que la columna Peso se establece como un tipo "Número decimal" y tiene el formato para mostrar las posiciones decimales.

Couriers_FlattenedData = 
VAR Increment = 0.01
RETURN
    SELECTCOLUMNS (
        GENERATE (
            Couriers,
            GENERATESERIES ( Couriers[MinWeight] + Increment, Couriers[MaxWeight], Increment )
        ),
        "Courier", Couriers[Courier],
        "Country", Couriers[Country],
        "Weight", [Value],
        "Freight", Couriers[Freight]
    )

Versión de power query:

Con la versión de Power Query, ahora necesitamos usar List.Numbers para crear la lista con un incremento distinto de 1, y también asegurarnos de que la columna Peso es el número de tipo.

let
    Increment = 0.01,
    Source = Couriers,
    WeightList =
      Table.CombineColumns( Source, {"MinWeight", "MaxWeight"},
        each let MinWeight = _{0}, MaxWeight = _{1}, Count = (MaxWeight-MinWeight)/Increment
        in List.Numbers(MinWeight+Increment, Count, Increment),
        "Weight"
      ),
    ExpandWeightList = Table.ExpandListColumn(WeightList, "Weight"),
    ChangedType = Table.TransformColumnTypes(ExpandWeightList,{{"Weight", type number}})
in
    ChangedType

saludos

Owen

@OwenAuger Muchas gracias. Agradezco su ayuda para mi segunda pregunta. Me doy cuenta después de escribir la fórmula DAX para generar la tabla, necesito fijar el decimal a 2 valores.

Gracias Owen. Lo usaré y volveré y marcaré tu respuesta. Agradezca su rápida respuesta.

Para la solución Editor de consultas, he duplicado la tabla base (Couriers) dentro del editor de consultas y, a continuación, he pegado el código M en el Editor avanzado. Y más tarde han cambiado el nombre de esa tabla como Couriers_FlattenedData.

No sé nada en lenguaje M, estoy agradecido por su solución.

@Owen Auger Gracias Owen, agradezca enormemente su ayuda.

Helpful resources

Announcements
Microsoft Fabric Learn Together

Microsoft Fabric Learn Together

Covering the world! 9:00-10:30 AM Sydney, 4:00-5:30 PM CET (Paris/Berlin), 7:00-8:30 PM Mexico City

PBI_APRIL_CAROUSEL1

Power BI Monthly Update - April 2024

Check out the April 2024 Power BI update to learn about new features.

April Fabric Community Update

Fabric Community Update - April 2024

Find out what's new and trending in the Fabric Community.