Forum Discussion
Transformación de PowerQuery
Estimados todos,
Tengo este tipo de tabla en powerquery:
Mesa original
| Source.Name | ARTE | 15/01/2025 | 14/01/2025 | 13/01/2025 | 12/01/2025 | 11/01/2025 | 10/01/2025 | 09/01/2025 | 08/01/2025 | 07/01/2025 | 06/01/2025 | 05/01/2025 | 04/01/2025 | 03/01/2025 | 02/01/2025 | 01/01/2025 |
| 1 | SUMA | 316 | 491 | 800 | 740 | 758 | 327 | 345 | 764 | 871 | 550 | 589 | 453 | 155 | 504 | 465 |
| 1 | pera | 280 | 25 | 500 | 284 | 454 | 142 | 91 | 447 | 461 | 296 | 473 | 86 | 42 | 201 | 292 |
| 1 | plátano | 36 | 466 | 300 | 456 | 304 | 185 | 254 | 317 | 410 | 254 | 116 | 367 | 113 | 303 | 173 |
| Source.Name | ARTE | 16/01/2025 | 15/01/2025 | 14/01/2025 | 13/01/2025 | 12/01/2025 | 11/01/2025 | 10/01/2025 | 09/01/2025 | 08/01/2025 | 07/01/2025 | 06/01/2025 | 05/01/2025 | 04/01/2025 | 03/01/2025 | 02/01/2025 |
| 2 | SUMA | 615 | 316 | 491 | 800 | 740 | 758 | 327 | 345 | 764 | 871 | 550 | 589 | 453 | 155 | 504 |
| 2 | pera | 414 | 280 | 25 | 500 | 284 | 454 | 142 | 91 | 447 | 461 | 296 | 473 | 86 | 42 | 201 |
| 2 | plátano | 201 | 36 | 466 | 300 | 456 | 304 | 185 | 254 | 317 | 410 | 254 | 116 | 367 | 113 | 303 |
| Source.Name | ARTE | 17/01/2025 | 16/01/2025 | 15/01/2025 | 14/01/2025 | 13/01/2025 | 12/01/2025 | 11/01/2025 | 10/01/2025 | 09/01/2025 | 08/01/2025 | 07/01/2025 | 06/01/2025 | 05/01/2025 | 04/01/2025 | 03/01/2025 |
| 3 | SUMA | 540 | 615 | 316 | 491 | 800 | 740 | 758 | 327 | 345 | 764 | 871 | 550 | 589 | 453 | 155 |
| 3 | pera | 350 | 414 | 280 | 25 | 500 | 284 | 454 | 142 | 91 | 447 | 461 | 296 | 473 | 86 | 42 |
| 3 | plátano | 190 | 201 | 36 | 466 | 300 | 456 | 304 | 185 | 254 | 317 | 410 | 254 | 116 | 367 | 113 |
| Source.Name | ARTE | 18/01/2025 | 17/01/2025 | 16/01/2025 | 15/01/2025 | 14/01/2025 | 13/01/2025 | 12/01/2025 | 11/01/2025 | 10/01/2025 | 09/01/2025 | 08/01/2025 | 07/01/2025 | 06/01/2025 | 05/01/2025 | 04/01/2025 |
| 4 | SUMA | 490 | 540 | 615 | 316 | 491 | 800 | 740 | 758 | 327 | 345 | 764 | 871 | 550 | 589 | 453 |
| 4 | pera | 256 | 350 | 414 | 280 | 25 | 500 | 284 | 454 | 142 | 91 | 447 | 461 | 296 | 473 | 86 |
| 4 | plátano | 234 | 190 | 201 | 36 | 466 | 300 | 456 | 304 | 185 | 254 | 317 | 410 | 254 | 116 | 367 |
| Source.Name | ARTE | 19/01/2025 | 18/01/2025 | 17/01/2025 | 16/01/2025 | 15/01/2025 | 14/01/2025 | 13/01/2025 | 12/01/2025 | 11/01/2025 | 10/01/2025 | 09/01/2025 | 08/01/2025 | 07/01/2025 | 06/01/2025 | 05/01/2025 |
| 5 | SUMA | 820 | 490 | 540 | 615 | 316 | 491 | 800 | 740 | 758 | 327 | 345 | 764 | 871 | 550 | 589 |
| 5 | pera | 437 | 256 | 350 | 414 | 280 | 25 | 500 | 284 | 454 | 142 | 91 | 447 | 461 | 296 | 473 |
| 5 | plátano | 383 | 234 | 190 | 201 | 36 | 466 | 300 | 456 | 304 | 185 | 254 | 317 | 410 | 254 | 116 |
| Source.Name | ARTE | 20/01/2025 | 19/01/2025 | 18/01/2025 | 17/01/2025 | 16/01/2025 | 15/01/2025 | 14/01/2025 | 13/01/2025 | 12/01/2025 | 11/01/2025 | 10/01/2025 | 09/01/2025 | 08/01/2025 | 07/01/2025 | 06/01/2025 |
| 6 | SUMA | 424 | 820 | 490 | 540 | 615 | 316 | 491 | 800 | 740 | 758 | 327 | 345 | 764 | 871 | 550 |
| 6 | pera | 137 | 437 | 256 | 350 | 414 | 280 | 25 | 500 | 284 | 454 | 142 | 91 | 447 | 461 | 296 |
| 6 | plátano | 287 | 383 | 234 | 190 | 201 | 36 | 466 | 300 | 456 | 304 | 185 | 254 | 317 | 410 | 254 |
Necesito transformar la tabla anterior en el siguiente formato:
Mesa deseada
| ARTE | Fecha | Valor |
| SUMA | 01/01/2025 | 465 |
| SUMA | 02/01/2025 | 504 |
| SUMA | 03/01/2025 | 155 |
| SUMA | 04/01/2025 | 453 |
| SUMA | 05/01/2025 | 589 |
| SUMA | 06/01/2025 | 550 |
| SUMA | 07/01/2025 | 871 |
| SUMA | 08/01/2025 | 764 |
| SUMA | 09/01/2025 | 345 |
| SUMA | 10/01/2025 | 327 |
| SUMA | 11/01/2025 | 758 |
| SUMA | 12/01/2025 | 740 |
| SUMA | 13/01/2025 | 800 |
| SUMA | 14/01/2025 | 491 |
| SUMA | 15/01/2025 | 316 |
| SUMA | 16/01/2025 | 615 |
| SUMA | 17/01/2025 | 540 |
| SUMA | 18/01/2025 | 490 |
| SUMA | 19/01/2025 | 820 |
| SUMA | 20/01/2025 | 424 |
Do you know what actions I need to perform to go from Mesa original to Mesa deseada?
Muchas gracias
@burakkaragoz y @Elena_Kalina
La solución que proporcionó no funcionará porque cada fuente tiene diferentes columnas de fecha.
Si convierte la fila superior en un encabezado o anula la dinamización de toda la tabla como ha sugerido amablemente, entonces produce la respuesta incorrecta.
Pruébalo y comparte un PBIX de lo que creas que funciona. Gracias
10 Replies
- Syndicate_AdminAdministrator
Pasos para transformar los datos en Power Query
Promover encabezados (si es necesario):
Si sus encabezados no se reconocen, use "Usar la primera fila como encabezados"
Eliminación de columnas innecesarias:
Elimine la columna "Source.Name", ya que no es necesaria en la salida
Desdinamización de las columnas de fecha:
Seleccione la columna "ART"
Haga clic con el botón derecho en su encabezado → Anular la dinamización de otras columnas
O bien: pestaña Transformar → Anular dinamización de columnas → Anular dinamización de otras columnas
Cambiar el nombre de las columnas:
Cambiar "Atributo" a "Fecha"
Cambiar "Valor" a "Valor"
Filtre solo para filas SUM (si solo desea SUM):
Filtre la columna ART para mostrar solo los valores "SUM"
Convertir fechas al formato adecuado:
Seleccione la columna Fecha → pestaña Transformar → Tipo de datos → Fecha
Ordenar por fecha:
Seleccione la columna Fecha → pestaña Inicio → Ordenar de forma ascendente
Solución alternativa de código M (directamente en el editor avanzado)
Si está trabajando en el Editor avanzado de Power Query, puede usar este código M:
let Source = #"Your Previous Step", // Replace with your actual source #"Removed Columns" = Table.RemoveColumns(Source,{"Source.Name"}), #"Unpivoted Other Columns" = Table.UnpivotOtherColumns(#"Removed Columns", {"ART"}, "Date", "Value"), #"Filtered Rows" = Table.SelectRows(#"Unpivoted Other Columns", each ([ART] = "SUM")), #"Changed Type" = Table.TransformColumnTypes(#"Filtered Rows",{{"Date", type date}}), #"Sorted Rows" = Table.Sort(#"Changed Type",{{"Date", Order.Ascending}}) in #"Sorted Rows" - Syndicate_AdminAdministrator
La respuesta que recibió es acertada y cubre tanto el método paso a paso como una solución de código M lista para usar para su transformación de Power Query.Para agregar algunas aclaraciones:
- Si no se reconocen los encabezados, use "Usar la primera fila como encabezados" en Power Query. Esto es importante para que los pasos posteriores funcionen correctamente.
- Al anular la dinamización de las columnas de fecha, convertirá la tabla ancha en un formato largo, que es exactamente lo que necesita para la "Tabla deseada".
- Filtrar solo las filas SUM es crucial, ya que solo desea que estén en la salida final.
- El código M proporcionado es un excelente atajo si te sientes cómodo con el Editor avanzado. Simplemente reemplace "Su paso anterior" con el nombre del paso anterior real en su consulta.
Este es un resumen rápido del enfoque de código M:
mlet Source = #"Your Previous Step", // Replace with your actual step name #"Removed Columns" = Table.RemoveColumns(Source,{"Source.Name"}), #"Unpivoted Other Columns" = Table.UnpivotOtherColumns(#"Removed Columns", {"ART"}, "Date", "Value"), #"Filtered Rows" = Table.SelectRows(#"Unpivoted Other Columns", each ([ART] = "SUM")), #"Changed Type" = Table.TransformColumnTypes(#"Filtered Rows", {{"Date", type date}}), #"Sorted Rows" = Table.Sort(#"Changed Type",{{"Date", Order.Ascending}}) in #"Sorted Rows"Con esto, obtendrá exactamente el formato de salida que mostró como "Tabla deseada".
Si tienes problemas con alguno de los pasos o necesitas ayuda para adaptar el código M al nombre real de tu mesa, ¡házmelo saber!
¡Buena suerte con tu transformación de Power Query!
traducción y formato respaldados por IA - Syndicate_AdminAdministrator
Estimados todos.
Obtuve la siguiente tabla:
ARTE Fecha Valor ARTÍCULO 15/01/2025 nulo ARTÍCULO 14/01/2025 nulo ARTÍCULO 13/01/2025 nulo ARTÍCULO 12/01/2025 nulo ARTÍCULO 11/01/2025 nulo ARTÍCULO 10/01/2025 nulo ARTÍCULO 09/01/2025 nulo ARTÍCULO 08/01/2025 nulo ARTÍCULO 07/01/2025 nulo ARTÍCULO 06/01/2025 nulo ARTÍCULO 05/01/2025 nulo ARTÍCULO 04/01/2025 nulo ARTÍCULO 03/01/2025 nulo ARTÍCULO 02/01/2025 nulo ARTÍCULO 01/01/2025 nulo Menchetti FA nulo 766,97 Menchetti FA nulo 765,48 Menchetti FA nulo 613,73 Menchetti FA nulo 1453,6 Menchetti FA nulo 1100,58 Menchetti FA nulo 1000,02 Menchetti FA nulo 950,54 Menchetti FA nulo 746,31 Menchetti FA nulo 924,9 Menchetti FA nulo 669,48 Menchetti FA nulo 844,7 Menchetti FA nulo 1280,44 Menchetti FA nulo 927,59 Menchetti FA nulo 1231,85 Menchetti FA nulo 634,31 ARTÍCULO 15/02/2025 nulo ARTÍCULO 14/02/2025 nulo ARTÍCULO 13/02/2025 nulo ARTÍCULO 12/02/2025 nulo ARTÍCULO 11/02/2025 nulo ARTÍCULO 10/02/2025 nulo ARTÍCULO 09/02/2025 nulo ARTÍCULO 08/02/2025 nulo ARTÍCULO 07/02/2025 nulo ARTÍCULO 06/02/2025 nulo ARTÍCULO 05/02/2025 nulo ARTÍCULO 04/02/2025 nulo ARTÍCULO 03/02/2025 nulo ARTÍCULO 02/02/2025 nulo ARTÍCULO 01/02/2025 nulo Menchetti FA nulo 757,68 Menchetti FA nulo 701,98 Menchetti FA nulo 1260,99 Menchetti FA nulo 360,49 Menchetti FA nulo 867,07 Menchetti FA nulo 860,66 Menchetti FA nulo 978,51 Menchetti FA nulo 1077,89 Menchetti FA nulo 1084,86 Menchetti FA nulo 941,76 Menchetti FA nulo 775,19 Menchetti FA nulo 858,75 Menchetti FA nulo 654,13 Menchetti FA nulo 1549,75 Menchetti FA nulo 1145,56 Lo que echo de menos son los pasos posteriores para obtener la siguiente tabla:
ARTE Fecha Valor ARTÍCULO 15/01/2025 766,97 ARTÍCULO 14/01/2025 765,48 ARTÍCULO 13/01/2025 613,73 ARTÍCULO 12/01/2025 1453,6 ARTÍCULO 11/01/2025 1100,58 ARTÍCULO 10/01/2025 1000,02 ARTÍCULO 09/01/2025 950,54 ARTÍCULO 08/01/2025 746,31 ARTÍCULO 07/01/2025 924,9 ARTÍCULO 06/01/2025 669,48 ARTÍCULO 05/01/2025 844,7 ARTÍCULO 04/01/2025 1280,44 ARTÍCULO 03/01/2025 927,59 ARTÍCULO 02/01/2025 1231,85 ARTÍCULO 01/01/2025 634,31 ARTÍCULO 15/02/2025 757,68 ARTÍCULO 14/02/2025 701,98 ARTÍCULO 13/02/2025 1260,99 ARTÍCULO 12/02/2025 360,49 ARTÍCULO 11/02/2025 867,07 ARTÍCULO 10/02/2025 860,66 ARTÍCULO 09/02/2025 978,51 ARTÍCULO 08/02/2025 1077,89 ARTÍCULO 07/02/2025 1084,86 ARTÍCULO 06/02/2025 941,76 ARTÍCULO 05/02/2025 775,19 ARTÍCULO 04/02/2025 858,75 ARTÍCULO 03/02/2025 654,13 ARTÍCULO 02/02/2025 1549,75 ARTÍCULO 01/02/2025 1145,56 ¿Alguna sugerencia?
- Syndicate_AdminAdministrator
Puede consultar los pasos que se indican a continuación.
let Source = Table.FromRows(Json.Document(Binary.Decompress(Binary.FromText("1ZY7bsMwDIbv4jloSIqU5LEHaIemnYoMaZGxDwTo/SvSkczFmzQYBmhRovyT5gfZ7+8TTofp9PZUbMBYLM86kwGKTWxWsq5SUsuiM5E1JmmkiMZInnWvhGJRNEZAYzjKdD4sKr/Xy63cKOsGWmJsmC1S1CJTsZYCc7IH6JhmSy3p47MNNYxgWaMm8XH5LpfmaUFRbTARlmVsIlksA7aiTQWhzaC9hhCTjYPtsrKKuuqcfv5un9eH58vXtcw+vrzqWjwCHgmsKhTvsHeCd8g76B1wDszeyd5J3vEZgM8AfAbgM4A1Ay2MGgkRZQgPVeVOAiN356FKNBIWSLrzsEmCb8oesdDCQiNBrOP9eagqdxKCBfXloUo0EnCGETxskuCbskcstDBuJLC9vf48VJX6dVj60JeHqrEeCoFHALGJgu/KHrnQwqShkAmGAFFV6uchpAFAVJH1VyGHEURssUC+LXsEQwuL67FAPISIqnJnAY2F3kRUkfVcyGkEEefzPw==", BinaryEncoding.Base64), Compression.Deflate)), let _t = ((type nullable text) meta [Serialized.Text = true]) in type table [Source.Name = _t, ART = _t, #"15/01/2025" = _t, #"14/01/2025" = _t, #"13/01/2025" = _t, #"12/01/2025" = _t, #"11/01/2025" = _t, #"10/01/2025" = _t, #"09/01/2025" = _t, #"08/01/2025" = _t, #"07/01/2025" = _t, #"06/01/2025" = _t, #"05/01/2025" = _t, #"04/01/2025" = _t, #"03/01/2025" = _t, #"02/01/2025" = _t, #"01/01/2025" = _t]), #"Demoted Headers" = Table.DemoteHeaders(Source), #"Changed Type" = Table.TransformColumnTypes(#"Demoted Headers",{{"Column1", type text}, {"Column2", type text}, {"Column3", type text}, {"Column4", type text}, {"Column5", type text}, {"Column6", type text}, {"Column7", type text}, {"Column8", type text}, {"Column9", type text}, {"Column10", type text}, {"Column11", type text}, {"Column12", type text}, {"Column13", type text}, {"Column14", type text}, {"Column15", type text}, {"Column16", type text}, {"Column17", type text}}), #"Added Conditional Column1" = Table.AddColumn(#"Changed Type", "Source.Name", each if [Column1] = "Source.Name" then null else [Column1]), #"Filled Up" = Table.FillUp(#"Added Conditional Column1",{"Source.Name"}), #"Removed Columns" = Table.RemoveColumns(#"Filled Up",{"Column1"}), #"Unpivoted Other Columns" = Table.UnpivotOtherColumns(#"Removed Columns", {"Column2","Source.Name"}, "Attribute", "Value"), #"Added Conditional Column" = Table.AddColumn(#"Unpivoted Other Columns", "Custom1", each if Text.Contains([Value], "/") then [Value] else null), #"Added Custom" = Table.AddColumn(#"Added Conditional Column", "Custom", each let _SN = [Source.Name], _Attribute = [Attribute] in Table.SelectRows(#"Added Conditional Column",each [Source.Name] = _SN and [Attribute] = _Attribute and [Custom1] = null)[Value]), #"Expanded Custom" = Table.ExpandListColumn(#"Added Custom", "Custom"), #"Filtered Rows" = Table.SelectRows(#"Expanded Custom", each ([Custom1] <> null)), #"Removed Columns1" = Table.RemoveColumns(#"Filtered Rows",{"Column2", "Source.Name", "Attribute", "Value"}), #"Added Custom1" = Table.AddColumn(#"Removed Columns1", "ART", each "SUM"), #"Reordered Columns" = Table.ReorderColumns(#"Added Custom1",{"ART", "Custom1", "Custom"}), #"Split Column by Delimiter" = Table.SplitColumn(#"Reordered Columns", "Custom1", Splitter.SplitTextByDelimiter("/", QuoteStyle.Csv), {"Custom1.1", "Custom1.2", "Custom1.3"}), #"Changed Type1" = Table.TransformColumnTypes(#"Split Column by Delimiter",{{"Custom1.1", Int64.Type}, {"Custom1.2", Int64.Type}, {"Custom1.3", Int64.Type}}), #"Reordered Columns1" = Table.ReorderColumns(#"Changed Type1",{"ART", "Custom1.2", "Custom1.1", "Custom1.3", "Custom"}), #"Merged Columns" = Table.CombineColumns(Table.TransformColumnTypes(#"Reordered Columns1", {{"Custom1.2", type text}, {"Custom1.1", type text}, {"Custom1.3", type text}}, "zh-CN"),{"Custom1.2", "Custom1.1", "Custom1.3"},Combiner.CombineTextByDelimiter("/", QuoteStyle.None),"Date"), #"Renamed Columns" = Table.RenameColumns(#"Merged Columns",{{"Custom", "Value"}}), #"Changed Type2" = Table.TransformColumnTypes(#"Renamed Columns",{{"Date", type date}, {"Value", Int64.Type}}), #"Sorted Rows" = Table.Sort(#"Changed Type2",{{"Date", Order.Ascending}}) in #"Sorted Rows"Texto original en:
El resultado es el siguiente.
Saludos.
Rico Zhou
- Syndicate_AdminAdministrator
@burakkaragoz y @Elena_Kalina
La solución que proporcionó no funcionará porque cada fuente tiene diferentes columnas de fecha.
Si convierte la fila superior en un encabezado o anula la dinamización de toda la tabla como ha sugerido amablemente, entonces produce la respuesta incorrecta.
Pruébalo y comparte un PBIX de lo que creas que funciona. Gracias - Syndicate_AdminAdministrator
Hmmmh ... gracias o aceptando mi solución, pero no la arreglé.
Solo vi las otras soluciones de @burakkaragoz y es posible que @Elena_Kalina no funcionen.- Syndicate_AdminAdministrator
Sí, muchas gracias... Abrí un nuevo hilo porque puede ser más simple que esto, aunque no puedo encontrar una solución. Creo que las soluciones de otros son generadas por 😞 IA
- Syndicate_AdminAdministrator
Lo siento, por favor, no presté atención de inmediato a su tabla específica, ya que en cada línea posterior con las fechas había un cambio por un día, mientras que en su versión final le gustaría ver solo la primera mención.
De acuerdo con esto, edité todos los pasos que debes realizar:
// Step 1: Use first row as headers = Table.PromoteHeaders(#"PreviousStep", [PromoteAllScalars=true]) // Step 2: Remove Source.Name column = Table.RemoveColumns(#"Promoted Headers",{"Source.Name"}) // Step 3: Filter out banana and pear from ART column = Table.SelectRows(#"Removed Columns", each ([ART] <> "banana" and [ART] <> "pear")) // Step 4: Unpivot other columns (keeping ART as identifier) = Table.UnpivotOtherColumns(#"Filtered Rows", {"ART"}, "Attribute", "Value") // Step 5: Add index column starting from 1 = Table.AddIndexColumn(#"Unpivoted Columns", "Index", 1, 1, Int64.Type) // Step 6: Filter to keep only needed rows (≤15 and specific indexes) = Table.SelectRows( #"Added Index", each Number.From([Index]) <= 15 or List.Contains({31, 61, 91, 121, 151}, Number.From([Index])) ) // Step 7: Replace dates for specific indexes = Table.ReplaceValue( #"Filtered Index Rows", each [Date], each if [Index] = 31 then #date(2025, 1, 16) else if [Index] = 61 then #date(2025, 1, 17) else if [Index] = 91 then #date(2025, 1, 18) else if [Index] = 121 then #date(2025, 1, 19) else if [Index] = 151 then #date(2025, 1, 20) else [Date], Replacer.ReplaceValue, {"Date"} )// Step 8: Rename 'Attitude' column to 'Date' = Table.RenameColumns(#"PreviousStep", {{"Attitude", "Date"}}) // Step 9: Convert text dates to proper date format = Table.TransformColumns( #"Renamed Columns", { {"Date", each try Date.FromText(_, "en-GB") // Try day/month/year format first otherwise try Date.FromText(_, "en-US") // Then try month/day/year otherwise null, // Return null if conversion fails type date} } ) // Step 10: Correct specific dates based on Index = Table.ReplaceValue( #"Converted Date Format", each [Date], each if [Index] = 31 then #date(2025, 1, 16) else if [Index] = 61 then #date(2025, 1, 17) else if [Index] = 91 then #date(2025, 1, 18) else if [Index] = 121 then #date(2025, 1, 19) else if [Index] = 151 then #date(2025, 1, 20) else [Date], Replacer.ReplaceValue, {"Date"} ) // Step 11: Sort by Date column = Table.Sort(#"Corrected Specific Dates", {{"Date", Order.Ascending}}) // Step 12: Remove Index column = Table.RemoveColumns(#"Sorted Rows", {"Index"})Aquí hay una captura de pantalla con mi resultado si de repente no entiendes algo, escribe para explicar
- Syndicate_AdminAdministrator
¿Podría eliminar la marca "Solución" de mi primer mensaje? Por lo tanto, no es correcto, a diferencia del actual. Para no confundir a los solicitantes de soluciones en el futuro