Forum Discussion

apoje's avatar
apoje
Helper II
6 years ago
Solved

How to append multiple columns from inside one table

Hi I would like to append multiple columns from one table into one column in PowerQuery.

I have a data looking like this:

 
bundle-idcontent1-idquantity1content2-idquantity2content3-idquantity3content4-idquantity4
abcd1xyC1-110xyC2-11xyC3-112xyC4-111
abcd2xyC1-212xyC2-21xyC3-212xyC4-211
abcd3xyC1-314xyC2-31xyC3-33xyC4-311
abcd4xyC1-414xyC2-41xyC3-412xyC4-411
abcd5xyC1-514xyC2-51xyC3-512xyC4-511
abcd6xyC1-614xyC2-61xyC3-63xyC4-611
abcd7xyC1-714xyC2-71xyC3-712xyC4-711
abcd8xyC1-814xyC2-81xyC3-812xyC4-811
abcd9xyC1-914xyC2-91xyC3-93xyC4-911
abcd10xyC1-1014xyC2-101xyC3-1012xyC4-1011
abcd11xyC1-1114xyC2-111xyC3-1112xyC4-1111

 

I would like to have the following result:

 
contentAllQuantityAll
xyC1-110
xyC1-212
xyC1-314
xyC1-414
xyC1-514
xyC1-614
xyC1-714
xyC1-814
xyC1-914
xyC1-1014
xyC1-1114
xyC1-1214
xyC2-11
xyC2-21
xyC2-31
xyC2-41
xyC2-51
xyC2-61
xyC2-71
xyC2-81
xyC2-91
xyC2-101
xyC2-111
xyC2-121
xyC3-112
xyC3-212
xyC3-33
xyC3-412
xyC3-512
xyC3-63
xyC3-712
xyC3-812
xyC3-93
xyC3-1012
xyC3-1112

 

 

I would appreciate all the help you can give me. Thank you!

Andraz

  • Hi apoje 

    I am not sure why you've completely ignored my solution all along 🤔. It does exactly what you showed in your first post in a simple way. If the base table is "tbl_bundle" in the files you've shared, you can create a blank query with the following M code and you'll get the result. It is the same as I posted a couple of days ago already:  

    let
        Source = tbl_bundle,
        #"Removed Columns" = Table.RemoveColumns(Source,{"SKU-bundleID"}),
        ExtractColumns_ = Table.ToColumns(#"Removed Columns"),
        ContentCols_ = List.Combine(List.Alternate(ExtractColumns_,1,1,1)),
        QuantityCols_ = List.Combine(List.Alternate(ExtractColumns_,1,1,0)),
        final_ = Table.FromColumns({ContentCols_, QuantityCols_}, {"ContentAll", "QuantityAll"})
    in
        final_

     

    Please mark the question solved when done and consider giving kudos if posts are helpful.

    Contact me privately for support with any larger-scale BI needs, tutoring, etc.

    Cheers 

17 Replies

  • Hi! i don't thinks this is just column. Your idea is whole new table. You can add a new step on your power query that will transform the complete table or create a blank query to query your table creating a second one with the result. Let's assume your table name is Table1. Now you can create a new blank query with a code that should be like this:

    = Table.Combine({
        Table.RenameColumns(
            Table.SelectColumns(Table1, "idcontent1", "idquantity1")
            ,{{"idcontent1", "idcontent"},{"idquantity1", "idquantity"} })
        ,
        Table.RenameColumns(
            Table.SelectColumns(Table1, "idcontent2", "idquantity2")
            ,{{"idcontent2", "idcontent"},{"idquantity2", "idquantity"} })
        ,
        Table.RenameColumns(
            Table.SelectColumns(Table1, "idcontentN", "idquantityN")
            ,{{"idcontentN", "idcontent"},{"idquantityN", "idquantity"} })
    })

     Table.Combine is for append. Table.RenameColumns to append the same columns together. Table.SelectColumns is to just select the columns you will use in the append.

     

    Hope this helps,

    • AlB's avatar
      AlB
      Community Champion

      Hi apoje,

      copy this M code in a blank query to see the steps starting from your initial example

       

       

      let
          Source = Table.FromRows(Json.Document(Binary.Decompress(Binary.FromText("XdJLCgMxDAPQu2Q9hdhxfuseY5hFP4dob98Go9aaXQTRIwHte7rdH09JW3q9r3JZB8me1JOH4kE9mSdJx+aAAtBwSz0BUAKUgQJgHcQAlAisUNAv3Df0jfoW+0YPMAYqgEpAjUAloDLQADQCWgRa/EHjfke/U7/HfqcHdAYGgEHAiMAgYDAwAUwCZgRm/MHkPobznVEmweNvSJmXlE/Kf4zCCs/xtEcM8vgA", BinaryEncoding.Base64), Compression.Deflate)), let _t = ((type nullable text) meta [Serialized.Text = true]) in type table [#"bundle-id" = _t, #"content1-id" = _t, quantity1 = _t, #"content2-id" = _t, quantity2 = _t, #"content3-id" = _t, quantity3 = _t, #"content4-id" = _t, quantity4 = _t]),
          #"Changed Type" = Table.TransformColumnTypes(Source,{{"bundle-id", type text}, {"content1-id", type text}, {"quantity1", Int64.Type}, {"content2-id", type text}, {"quantity2", Int64.Type}, {"content3-id", type text}, {"quantity3", Int64.Type}, {"content4-id", type text}, {"quantity4", Int64.Type}}),
          #"Removed Columns" = Table.RemoveColumns(#"Changed Type",{"bundle-id"}),
      
          ExtractColumns_ = Table.ToColumns(#"Removed Columns"),
          ContentCols_ = List.Combine(List.Alternate(ExtractColumns_,1,1,1)),
          QuantityCols_ = List.Combine(List.Alternate(ExtractColumns_,1,1,0)),
          final_ = Table.FromColumns({ContentCols_, QuantityCols_})
      in
          final_

       

       

       

      Please mark the question solved when done and consider giving kudos if posts are helpful.

      Contact me privately for support with any larger-scale BI needs, tutoring, etc.

      Cheers 

    • apoje's avatar
      apoje
      Helper II

      hi ibarrau  you are right my phrasing was off. The result would actually be a new table. 

       

       

      = Table.Combine({
          Table.RenameColumns(
              Table.SelectColumns(tblSL, "var-nr-1", "Multiplication.1")
              ,{{"var-nr-1", "var-nr"},{"Multiplication.1", "Quantity"} })
          ,
          Table.RenameColumns(
              Table.SelectColumns(tblSL, "var-nr-2", "Multiplication.2")
              ,{{"var-nr-2", "var-nr"},{"Multiplication.2", "Quantity"} })
          ,
          Table.RenameColumns(
              Table.SelectColumns(tblSL, "var-nr-3", "Multiplication.3")
              ,{{"var-nr-3", "var-nr"},{"Multiplication.3", "Quantity"} })
          ,
          Table.RenameColumns(
              Table.SelectColumns(tblSL, "var-nr-4", "Multiplication.4")
              ,{{"var-nr-4", "var-nr"},{"Multiplication.4", "Quantity"} })
      })

       

       

      I have created a blank query and written the code as you suggested. However I am getting an error message

      Expression.Error: We cannot convert the value "Multiplication.1" to type Number.
      Details:
      Value=Multiplication.1
      Type=[Type]

       

      All the Multiplication columns are a whole number type. I am not sure how to amend the error...

       

      Regards,
      Andraz


      • ibarrau's avatar
        ibarrau
        Super User

        Ok good. The error doesn't look that is coming from that code. It says it's trying to convert multiplication.1 to number and it can't do it. Check your previous o next steps and check if you have a convert to number somewhere. You might have wrong data in the column that is not allowing you to convert it or apply math over the column.

        You can always check my code by parts. Starting without the combine to see if it works:

            Table.RenameColumns(
                Table.SelectColumns(tblSL, "var-nr-1", "Multiplication.1")
                ,{{"var-nr-1", "var-nr"},{"Multiplication.1", "Quantity"} })

        If you want you can share previous steps so we can help you find the error.

         

        Regards, 

  • ziying35's avatar
    ziying35
    Impactful Individual

    Hi, apoje 

    my code as below:

    let
        Source = Excel.CurrentWorkbook(){[Name="tbl_bundle"]}[Content],
        trans = Table.Combine(List.Transform(List.Split(List.Skip(Table.ToColumns(Source)),2),each Table.FromColumns(_,{"ContentAll","QuantityAll"}))),
        filter = Table.SelectRows(trans, each ([QuantityAll] <> null and [QuantityAll] <> 0)),
        chtype = Table.TransformColumnTypes(filter,{{"ContentAll", Text.Type}})
    in
        chtype