Forum Discussion

Mic1979's avatar
Mic1979
Post Partisan
1 year ago
Solved

Multiply two columns based on column header name

Dear all,

 

I need to multiply two columns based on the Header Name:

  • Column1 contains % 
  • Column2 contains €

The code I used is this:

 

Result = Table.AddColumn (
RemoveDuplicate,
"Result",
(_) => ((x,y) => List.Zip({x,y}))
(Table.SelectColumns (TransformPrice, List.Select(Table.ColumnNames(TransformPrice), each Text.Contains(_, "€"))),
Table.SelectColumns (TransformPrice, List.Select(Table.ColumnNames(TransformPrice), each Text.Contains(_, "%")))))

]

[Result]

 

I used List.Zip to match together rows with the same index. I know this is not complete because I am missing the last part making the calculation. However:

  1. Is this the code I am showing you correct?
  2. How can I complete it to make the multiplication of the columns?

Thanks for your help.

  • Hi Mic1979, check this. This will also work if you have more than 1 % or € column (they will be multiplied all together)

     

    Output

     

     

    let
        Source = Table.FromRows(Json.Document(Binary.Decompress(Binary.FromText("i45WMlVV0lFKBGJDAzBhYKAUqxMNZIDEk4DYCCRuChM3AosnA7ExTD1QIhYA", BinaryEncoding.Base64), Compression.Deflate)), let _t = ((type nullable text) meta [Serialized.Text = true]) in type table [#"Column1%" = _t, Column2 = _t, #"Column3€" = _t, Column4 = _t]),
        ChangedType = Table.TransformColumnTypes(Source,{{"Column1%", Percentage.Type}, {"Column3€", type number}, {"Column4", type number}}),
        Ad_Multiplied = Table.AddColumn(ChangedType, "Multiplied % and €", each
            [ a = Record.ToList(Record.SelectFields(_, List.Select(Record.FieldNames(_), (x)=> List.Contains({"%", "€"}, x, (y,z)=> Text.Contains(z, y))))),
              b = Expression.Evaluate(Text.Combine(List.Transform(a, (x)=> Number.ToText(x, "G", "en-US")), "*"))
            ][b], type number)
    in
        Ad_Multiplied

     

     

11 Replies

  • dufoq3's avatar
    dufoq3
    Community Champion

    Hi Mic1979, check this. This will also work if you have more than 1 % or € column (they will be multiplied all together)

     

    Output

     

     

    let
        Source = Table.FromRows(Json.Document(Binary.Decompress(Binary.FromText("i45WMlVV0lFKBGJDAzBhYKAUqxMNZIDEk4DYCCRuChM3AosnA7ExTD1QIhYA", BinaryEncoding.Base64), Compression.Deflate)), let _t = ((type nullable text) meta [Serialized.Text = true]) in type table [#"Column1%" = _t, Column2 = _t, #"Column3€" = _t, Column4 = _t]),
        ChangedType = Table.TransformColumnTypes(Source,{{"Column1%", Percentage.Type}, {"Column3€", type number}, {"Column4", type number}}),
        Ad_Multiplied = Table.AddColumn(ChangedType, "Multiplied % and €", each
            [ a = Record.ToList(Record.SelectFields(_, List.Select(Record.FieldNames(_), (x)=> List.Contains({"%", "€"}, x, (y,z)=> Text.Contains(z, y))))),
              b = Expression.Evaluate(Text.Combine(List.Transform(a, (x)=> Number.ToText(x, "G", "en-US")), "*"))
            ][b], type number)
    in
        Ad_Multiplied

     

     

    • Mic1979's avatar
      Mic1979
      Post Partisan

      Hello dufoq3

      Your solution is working greatly. THANKS A LOT.

      • dufoq3's avatar
        dufoq3
        Community Champion

        You're welcome Mic, enjoy 😉

  • Mic1979's avatar
    Mic1979
    Post Partisan

    Can I ask you some question to understand the logic behind your code?

    I am not familiar with this structure.

     

    Thanks.

    • dufoq3's avatar
      dufoq3
      Community Champion

      Of course, go ahead. Which part do you need to explain?

      • Mic1979's avatar
        Mic1979
        Post Partisan

        Please let me study this a little bit, I would like to make the right questions and not waste your time.

        Thanks a lot!!