Fusionar columnas entre valores de columna, recuento dinámico de columnas

Un usuario Pregunto ✅

tondeli

En mis datos tengo id-key, dimension y dimension value. Tres columnas en total. No sé cuántos valores diferentes contiene la columna de dimensión (0,1,2 … n). He pivotado mis datos para que las dimensiones estén en columnas. El siguiente paso es que necesito fusionar los valores de dimensión como una columna.

My data after pivot-operation:

id-key 1 2 3 4 5 0 Merged id001 a 3 aa true a - 3 - aa - - - true id002 5 rh zz false - 5 - rh - zz - - false

Mi problema es que no estoy seguro de cuántas columnas tendré en este punto. Entonces, lo siguiente no funciona.

= Table.AddColumn(#"Pivoted Column", "Merged", each Text.Combine({[1], [2], [3], [4], [5], [0]}, " - "), type text)

Me gustaría usar una solución como esta:

= Table.AddColumn(#"Pivoted Column", "Merged", each Text.Combine({between([1], [0])}, " - "), type text)

¡Todas las ideas son bienvenidas!

MarcelBeug

En respuesta a v-huizhn-msft

Una solución dinámica:

    #"Added Custom" = 
        Table.AddColumn(
            #"Pivoted Column",
            "Merged", 
            each Text.Combine(
                List.Transform(
                    List.Skip(
                        Record.FieldValues(_)), 
                    each Replacer.ReplaceValue(
                        Text.From(_),
                        null,
                        "")),
                " - "),
            type text)

tondeli

Mis ideas fueron comenzar con:

Table.ColumnNames

  • Crea una lista de todos los nombres de columna en la tabla -> No estoy seguro de cómo nombrar mi tabla. ¿Es el último paso en mi QueryEditor?

List.Generar

  • Crea una lista basada en valores -> Necesito crear un valor mínimo y máximo de mi columna de dimensión

Text.Combine

  • Lista de texto para combinar -> No estoy seguro de si necesitaré este paso …

No tengo ninguno de estos para trabajar todavía …

En respuesta a tondeli

Hola @tondeli,

Como probé, seleccione todas las columnas (sin importar cuántas columnas tenga) haciendo clic en «CTRL + A», luego haga clic derecho-> Combinar columnas-> escriba el espacio personalizado como se muestra en la imagen 2.

Foto 1Foto 1 Imagen2Imagen2
Obtendrá el resultado esperado de la siguiente manera.

resultadoresultado
Es más fácil fusionar columnas mediante la navegación de la interfaz, en lugar de escribir la instrucción de consulta. Después de la operación en la interfaz, la declaración de Power Query se generará automáticamente, puede hacer clic en «Editor avanzado» y ver las declaraciones.

Atentamente,
Angelia

tondeli

En respuesta a v-huizhn-msft

Esta solución me da la siguiente línea de consulta:

= Table.CombineColumns(#"Pivoted Column",{"id-key", "1", "2", "3", "4", "5", "0"},Combiner.CombineTextByDelimiter(" - ", QuoteStyle.None),"Merged")

Todavía «codifica» esos nombres de columna. Si elimino una columna, este paso da error. Si agrego una nueva columna, este paso omite esa columna en este paso.

El resultado está bien, pero me gustaría hacer referencia a la cantidad dinámica de columnas en mis datos.

MarcelBeug

En respuesta a tondeli

Solo para aclarar:

no reaccionó a mi solución ya que es dinámica.

smpa01

En respuesta a MarcelBeug

Hola @MarcelBeug,

Tengo una situación similar y me preguntaba si podría ayudarme con esto.

Tengo los datos sin procesar adjuntos y el resultado deseado aquí: https://drive.google.com/open?id=1fNQePPTGmQ8dDXTsQFwsSS6UMPb4Sss1

La salida debe generarse en dos columnas donde Combiner.CombineTextByDelimiter ignorará los valores nulos y si hay un valor nulo no habrá delimitador.

He trabajado en esto siguiendo el código. Pero, por supuesto, no pude generar la salida como deseaba. Si pudiera haber trabajado el código como lo deseaba, en el paso final dividiría la tabla en el primer delimitador y tendría el resultado.

let
    Source = Excel.Workbook(File.Contents("C:Userssmpa01DocumentsPBIXDynamic Merge Test.xlsx"), null, true),
    Sheet1_Sheet = Source{[Item="Sheet1",Kind="Sheet"]}[Data],
    #"Changed Type" = Table.TransformColumnTypes(Sheet1_Sheet,{{"Column1", type text}, {"Column2", type text}}),
    #"Promoted Headers" = Table.PromoteHeaders(#"Changed Type", [PromoteAllScalars=true]),
    #"Changed Type1" = Table.TransformColumnTypes(#"Promoted Headers",{{"Name", type text}, {"Country", type text}}),
    #"Sorted Rows" = Table.Sort(#"Changed Type1",{{"Name", Order.Ascending}}),
    #"Grouped Rows" = Table.Group(#"Sorted Rows", {"Name"}, {{"Count", each _, type table}}),
    #"Added Custom" = Table.AddColumn(#"Grouped Rows", "Custom", each Table.AddIndexColumn([Count],"X",1,1)),
    #"Removed Columns" = Table.RemoveColumns(#"Added Custom",{"Count"}),
    #"Expanded Custom" = Table.ExpandTableColumn(#"Removed Columns", "Custom", {"Name", "Country", "X"}, {"Custom.Name", "Custom.Country", "Custom.X"}),
    #"Removed Columns1" = Table.RemoveColumns(#"Expanded Custom",{"Name"}),
    #"Pivoted Column" = Table.Pivot(Table.TransformColumnTypes(#"Removed Columns1", {{"Custom.X", type text}}, "en-US"), List.Distinct(Table.TransformColumnTypes(#"Removed Columns1", {{"Custom.X", type text}}, "en-US")[Custom.X]), "Custom.X", "Custom.Country"),
    #"Replaced Value" = Table.ReplaceValue(#"Pivoted Column",null,"",Replacer.ReplaceValue,{"Custom.Name", "1", "2", "3", "4", "5", "6"}),
    Custom1 = Table.ToList(#"Replaced Value", Combiner.CombineTextByDelimiter(",")),
    #"Converted to Table" = Table.FromList(Custom1, Splitter.SplitByNothing(), null, null, ExtraValues.Error)
in
    #"Converted to Table"

Gracias de antemano

smpa01

En respuesta a smpa01

Lo encontré: https://community.powerbi.com/t5/Desktop/Combine-columns-if-not-null-or-empty/td-p/187969

MarcelBeug

En respuesta a v-huizhn-msft

Una solución dinámica:

    #"Added Custom" = 
        Table.AddColumn(
            #"Pivoted Column",
            "Merged", 
            each Text.Combine(
                List.Transform(
                    List.Skip(
                        Record.FieldValues(_)), 
                    each Replacer.ReplaceValue(
                        Text.From(_),
                        null,
                        "")),
                " - "),
            type text)

Flyckten

En respuesta a MarcelBeug

@MarcelBeug ¿Podría explicar qué hacen las partes en su función? Me gusta el resultado, pero me cuesta ajustarlo a mis necesidades.

Atentamente,

Alex

smpa01

En respuesta a MarcelBeug

Esto es asombroso.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *