Forum Discussion

Syndicate_Admin's avatar
Syndicate_Admin
Administrator
1 year ago
Solved

Transformación de PowerQuery

Estimados todos,

Tengo este tipo de tabla en powerquery:

Mesa original

Source.NameARTE15/01/202514/01/202513/01/202512/01/202511/01/202510/01/202509/01/202508/01/202507/01/202506/01/202505/01/202504/01/202503/01/202502/01/202501/01/2025
1SUMA316491800740758327345764871550589453155504465
1pera28025500284454142914474612964738642201292
1plátano36466300456304185254317410254116367113303173
Source.NameARTE16/01/202515/01/202514/01/202513/01/202512/01/202511/01/202510/01/202509/01/202508/01/202507/01/202506/01/202505/01/202504/01/202503/01/202502/01/2025
2SUMA615316491800740758327345764871550589453155504
2pera41428025500284454142914474612964738642201
2plátano20136466300456304185254317410254116367113303
Source.NameARTE17/01/202516/01/202515/01/202514/01/202513/01/202512/01/202511/01/202510/01/202509/01/202508/01/202507/01/202506/01/202505/01/202504/01/202503/01/2025
3SUMA540615316491800740758327345764871550589453155
3pera35041428025500284454142914474612964738642
3plátano19020136466300456304185254317410254116367113
Source.NameARTE18/01/202517/01/202516/01/202515/01/202514/01/202513/01/202512/01/202511/01/202510/01/202509/01/202508/01/202507/01/202506/01/202505/01/202504/01/2025
4SUMA490540615316491800740758327345764871550589453
4pera256350414280255002844541429144746129647386
4plátano23419020136466300456304185254317410254116367
Source.NameARTE19/01/202518/01/202517/01/202516/01/202515/01/202514/01/202513/01/202512/01/202511/01/202510/01/202509/01/202508/01/202507/01/202506/01/202505/01/2025
5SUMA820490540615316491800740758327345764871550589
5pera4372563504142802550028445414291447461296473
5plátano38323419020136466300456304185254317410254116
Source.NameARTE20/01/202519/01/202518/01/202517/01/202516/01/202515/01/202514/01/202513/01/202512/01/202511/01/202510/01/202509/01/202508/01/202507/01/202506/01/2025
6SUMA424820490540615316491800740758327345764871550
6pera1374372563504142802550028445414291447461296
6plátano28738323419020136466300456304185254317410254

Necesito transformar la tabla anterior en el siguiente formato:

Mesa deseada

ARTEFechaValor
SUMA01/01/2025465
SUMA02/01/2025504
SUMA03/01/2025155
SUMA04/01/2025453
SUMA05/01/2025589
SUMA06/01/2025550
SUMA07/01/2025871
SUMA08/01/2025764
SUMA09/01/2025345
SUMA10/01/2025327
SUMA11/01/2025758
SUMA12/01/2025740
SUMA13/01/2025800
SUMA14/01/2025491
SUMA15/01/2025316
SUMA16/01/2025615
SUMA17/01/2025540
SUMA18/01/2025490
SUMA19/01/2025820
SUMA20/01/2025424

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

  • @powerbricco

    Pasos para transformar los datos en Power Query

    1. Promover encabezados (si es necesario):

      • Si sus encabezados no se reconocen, use "Usar la primera fila como encabezados"

    2. Eliminación de columnas innecesarias:

      • Elimine la columna "Source.Name", ya que no es necesaria en la salida

    3. 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

    4. Cambiar el nombre de las columnas:

      • Cambiar "Atributo" a "Fecha"

      • Cambiar "Valor" a "Valor"

    5. Filtre solo para filas SUM (si solo desea SUM):

      • Filtre la columna ART para mostrar solo los valores "SUM"

    6. Convertir fechas al formato adecuado:

      • Seleccione la columna Fecha → pestaña Transformar → Tipo de datos → Fecha

    7. 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"
  • @powerbricco ,


    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:

    m
    let
        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

  • Estimados todos.

    Obtuve la siguiente tabla:

    ARTEFechaValor
    ARTÍCULO15/01/2025nulo
    ARTÍCULO14/01/2025nulo
    ARTÍCULO13/01/2025nulo
    ARTÍCULO12/01/2025nulo
    ARTÍCULO11/01/2025nulo
    ARTÍCULO10/01/2025nulo
    ARTÍCULO09/01/2025nulo
    ARTÍCULO08/01/2025nulo
    ARTÍCULO07/01/2025nulo
    ARTÍCULO06/01/2025nulo
    ARTÍCULO05/01/2025nulo
    ARTÍCULO04/01/2025nulo
    ARTÍCULO03/01/2025nulo
    ARTÍCULO02/01/2025nulo
    ARTÍCULO01/01/2025nulo
    Menchetti FAnulo766,97
    Menchetti FAnulo765,48
    Menchetti FAnulo613,73
    Menchetti FAnulo1453,6
    Menchetti FAnulo1100,58
    Menchetti FAnulo1000,02
    Menchetti FAnulo950,54
    Menchetti FAnulo746,31
    Menchetti FAnulo924,9
    Menchetti FAnulo669,48
    Menchetti FAnulo844,7
    Menchetti FAnulo1280,44
    Menchetti FAnulo927,59
    Menchetti FAnulo1231,85
    Menchetti FAnulo634,31
    ARTÍCULO15/02/2025nulo
    ARTÍCULO14/02/2025nulo
    ARTÍCULO13/02/2025nulo
    ARTÍCULO12/02/2025nulo
    ARTÍCULO11/02/2025nulo
    ARTÍCULO10/02/2025nulo
    ARTÍCULO09/02/2025nulo
    ARTÍCULO08/02/2025nulo
    ARTÍCULO07/02/2025nulo
    ARTÍCULO06/02/2025nulo
    ARTÍCULO05/02/2025nulo
    ARTÍCULO04/02/2025nulo
    ARTÍCULO03/02/2025nulo
    ARTÍCULO02/02/2025nulo
    ARTÍCULO01/02/2025nulo
    Menchetti FAnulo757,68
    Menchetti FAnulo701,98
    Menchetti FAnulo1260,99
    Menchetti FAnulo360,49
    Menchetti FAnulo867,07
    Menchetti FAnulo860,66
    Menchetti FAnulo978,51
    Menchetti FAnulo1077,89
    Menchetti FAnulo1084,86
    Menchetti FAnulo941,76
    Menchetti FAnulo775,19
    Menchetti FAnulo858,75
    Menchetti FAnulo654,13
    Menchetti FAnulo1549,75
    Menchetti FAnulo1145,56

    Lo que echo de menos son los pasos posteriores para obtener la siguiente tabla:

    ARTEFechaValor
    ARTÍCULO15/01/2025766,97
    ARTÍCULO14/01/2025765,48
    ARTÍCULO13/01/2025613,73
    ARTÍCULO12/01/20251453,6
    ARTÍCULO11/01/20251100,58
    ARTÍCULO10/01/20251000,02
    ARTÍCULO09/01/2025950,54
    ARTÍCULO08/01/2025746,31
    ARTÍCULO07/01/2025924,9
    ARTÍCULO06/01/2025669,48
    ARTÍCULO05/01/2025844,7
    ARTÍCULO04/01/20251280,44
    ARTÍCULO03/01/2025927,59
    ARTÍCULO02/01/20251231,85
    ARTÍCULO01/01/2025634,31
    ARTÍCULO15/02/2025757,68
    ARTÍCULO14/02/2025701,98
    ARTÍCULO13/02/20251260,99
    ARTÍCULO12/02/2025360,49
    ARTÍCULO11/02/2025867,07
    ARTÍCULO10/02/2025860,66
    ARTÍCULO09/02/2025978,51
    ARTÍCULO08/02/20251077,89
    ARTÍCULO07/02/20251084,86
    ARTÍCULO06/02/2025941,76
    ARTÍCULO05/02/2025775,19
    ARTÍCULO04/02/2025858,75
    ARTÍCULO03/02/2025654,13
    ARTÍCULO02/02/20251549,75
    ARTÍCULO01/02/20251145,56

    ¿Alguna sugerencia?

  • @powerbricco ,

    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

  • @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



  • @powerbricco

    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_Admin's avatar
      Syndicate_Admin
      Administrator

      @powerbricco

      ¿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