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.
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.
Necesito desarrollar una nueva TABLA (llamada Couriers_FlattenedData) en Power BI , en la que, obteré una fila para cada valor entre MinWeight y MaxWeight.
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?
Solved! Go to Solution.
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
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
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
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.
Covering the world! 9:00-10:30 AM Sydney, 4:00-5:30 PM CET (Paris/Berlin), 7:00-8:30 PM Mexico City
Check out the April 2024 Power BI update to learn about new features.
User | Count |
---|---|
2 | |
1 | |
1 | |
1 | |
1 |