【问题标题】:How to add new column from calculation on two rows in power BI?如何在 Power BI 中的两行计算中添加新列?
【发布时间】:2021-12-10 13:27:33
【问题描述】:

我有下表:

我想使用查询编辑器(power Query)添加一个新列“Total”,这样当“GL”是“Gross Margin”时,“Total”应该是“Total India Market”上的“Gross Margin”乘以' “总印度市场”上的总净销售额,即 0.11*65687,如果“GL”不是“毛利”,则“总印度市场”+“出口”。

所需的输出应如下所示:

我不希望计算列应该在查询编辑器中,即电源查询。

【问题讨论】:

    标签: powerbi dax powerquery


    【解决方案1】:

    您可以使用电源查询来实现此目的

    首先添加一个索引列,然后为 Total India Market 计算前一行,然后添加自定义列以根据要求计算总计

    let
        Source = Excel.Workbook(File.Contents("C:\Users\anumua2\Downloads\im_25_oct_21.xlsx"), null, true),
        Data_Sheet = Source{[Item="Data",Kind="Sheet"]}[Data],
        #"Promoted Headers" = Table.PromoteHeaders(Data_Sheet, [PromoteAllScalars=true]),
        #"Changed Type" = Table.TransformColumnTypes(#"Promoted Headers",{{"Date", type date}, {"GL", type text}, {"Domestic Product", type number}, {"Total India Market", type number}, {"Export", type number}}),
        #"Added Index" = Table.AddIndexColumn(#"Changed Type", "Index", 1, 1, Int64.Type),
        #"Prev" = Table.AddColumn(#"Added Index", "Custom", each #"Added Index"{[Index]-2}[#"Total India Market"]),
        #"Renamed Columns" = Table.RenameColumns(Prev,{{"Custom", "Prev_Total India Market"}}),
        #"Replaced Errors" = Table.ReplaceErrorValues(#"Renamed Columns", {{"Prev_Total India Market", 0}}),
        #"Added Custom" = Table.AddColumn(#"Replaced Errors", "Custom", each if[GL] = "Gross Margin" then [Total India Market]*[Prev_Total India Market] else [Total India Market] + [Export]),
        #"Renamed Columns1" = Table.RenameColumns(#"Added Custom",{{"Custom", "Total"}})
    in
        #"Renamed Columns1"
    

    【讨论】:

      【解决方案2】:

      似乎Total Net Sales总是在Gross Margin之前的那一行。

      如果是这种情况,那么为了将一个值乘以前一行同一列中的值,您需要添加一个索引列,或者,我的偏好是因为它计算得更快,所以添加一个“移位列”,其中上一行的值现在位于同一行。

      let
          Source = Table.FromRows(Json.Document(Binary.Decompress(Binary.FromText("bZA/C4MwEMW/ijhLzWlyf0anTu2idBEHBykFacHY799LAqXELnnc8Xv3HhnHEkwNNVBZlZ33y14M7+2pw8kIR0FKE5VT9UsPr31ei6s6+nldvG6IBVXQIQegbZx1mem8vbwvLvN2f8QQaDCKiSEAeUh/68JhxxQ4JomX9eUv2fwrDwYCL2hMiuEMP7YPcMhCS6JqWxaTmQ7tQZLY+EWMGZ/a62EJHECb6oNzjrTQ9AE=", BinaryEncoding.Base64), Compression.Deflate)), let _t = ((type nullable text) meta [Serialized.Text = true]) in type table [Date = _t, GL = _t, #"Domestic Product" = _t, #"Total India Market" = _t, Export = _t]),
          #"Changed Type" = Table.TransformColumnTypes(Source,{{"Date", type date}, {"GL", type text}, 
              {"Domestic Product", type number}, {"Total India Market", type number}, {"Export", type number}}),
      
      //add a column = offset column from Total India Market
      //This will calculate faster than using an INDEX column
          offsetTotalIndiaMarket = 
              let 
                  tbl = #"Changed Type",
                  ShiftedList = {null} & List.RemoveLastN(tbl[Total India Market]),
                  Custom1 = Table.ToColumns(tbl) & {ShiftedList}
              in
                  Table.FromColumns(Custom1, Table.ColumnNames(tbl) & {"Shifted Tot India Market"}),
      
      //add custom column to execute the described calculation
          #"Added Custom" = Table.AddColumn(offsetTotalIndiaMarket, "Total", each 
              if [GL] = "Gross Margin" 
              then [Total India Market]*[Shifted Tot India Market] 
              else [Total India Market]+[Export]),
      
      //Remove shifted column
          #"Removed Columns" = Table.RemoveColumns(#"Added Custom",{"Shifted Tot India Market"})
      
      in
          #"Removed Columns"
      

      结果

      如果 不是Total Net Sales 总是在Gross Margin 之前的行上,那么我们可以使用不同的算法。但还必须知道 Gross Margin 是否会总是在前面有 Total Net Sales,或者我们是否还必须考虑无法计算。

      如果是这种情况,请对此答案发表评论

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-12-05
        • 2022-12-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多