Excel 比较列返回最大功率查询

Excel 比较列返回最大功率查询,excel,comparison,office365,powerquery,customcolumn,Excel,Comparison,Office365,Powerquery,Customcolumn,我有来自多个供应商的数据,希望进行比较。下图中显示的数据之前已经使用power query通过一系列步骤进行了转换。最后一步是旋转供应商列(在本例中由X、Y、Z组成),以便可以比较这些新列并返回最大值 如何比较X、Y和Z列中的值来执行此操作?重要的是,XY和Z不一定是唯一的供应商。如果我将A作为新供应商添加到原始数据中,将生成一个新的列A,我希望将其包括在比较中,以便在末尾的列处输出每行的最高值。所以从上往下读,在这个例子中,它会读:3,3,1,1,5,0.04,10等等 谢谢 链接到文件 M

我有来自多个供应商的数据,希望进行比较。下图中显示的数据之前已经使用power query通过一系列步骤进行了转换。最后一步是旋转供应商列(在本例中由X、Y、Z组成),以便可以比较这些新列并返回最大值

如何比较X、Y和Z列中的值来执行此操作?重要的是,XY和Z不一定是唯一的供应商。如果我将A作为新供应商添加到原始数据中,将生成一个新的列A,我希望将其包括在比较中,以便在末尾的列处输出每行的最高值。所以从上往下读,在这个例子中,它会读:3,3,1,1,5,0.04,10等等

谢谢

链接到文件

M代码:

let
    Source = Excel.CurrentWorkbook(){[Name="Table1"]}[Content],
    #"Changed Type" = Table.TransformColumnTypes(Source,{{"Material", type text}, {"Residual Solvents", type text}, {"RMQ", type text}, {"COA", type text}, {"Technical Data Sheet", type text}}),
    
    //Replace Time and null with blank
    #"Replaced Value" = Table.ReplaceValue(#"Changed Type","00:00:00","",Replacer.ReplaceText,{"Material", "RMQ", "Residual Solvents", "Technical Data Sheet", "COA"}),
    #"Replaced Value1" = Table.ReplaceValue(#"Replaced Value",null,"",Replacer.ReplaceValue,{"Material", "RMQ", "Residual Solvents", "Technical Data Sheet", "COA"}),
    
    //Trims all whitespace from user
    #"Power Trim" = Table.TransformColumns(#"Replaced Value1",{{"Material", #"PowerTrim", type text}, {"Residual Solvents", #"PowerTrim", type text}, {"RMQ", #"PowerTrim", type text}, {"COA", #"PowerTrim", type text}, {"Technical Data Sheet",#"PowerTrim", type text}}),
  
    //Unpivot to develop a single column of solvent/metals/date data
    #"Unpivoted Other Columns" = Table.UnpivotOtherColumns(#"Power Trim", {"Material", "Supplier"}, "Attribute", "Value"),

    //split into rows by line feed
    #"Split Column by Delimiter" = Table.ExpandListColumn(Table.TransformColumns(#"Unpivoted Other Columns", 
        {{"Value", Splitter.SplitTextByDelimiter("#(lf)", QuoteStyle.Csv), let itemType = (type nullable text) meta [Serialized.Text = true] in type {itemType}}}), "Value"),
    #"Trimmed Text" = Table.TransformColumns(#"Split Column by Delimiter",{{"Value", Text.Trim, type text}}),

    //filter out the blank rows
    #"Filtered Rows" = Table.SelectRows(#"Trimmed Text", each ([Value] <> "" and [Value] <> "Not Provided")),

    //Add custom column for separating the tables
    #"Added Custom" = Table.AddColumn(#"Filtered Rows", "Custom", each try Date.FromText([Value]) otherwise 
        if [Value] = "Heavy Metals" or [Value] = "Residual Solvents" or [Value] = "Other" then [Value] else null),
    #"Changed Type1" = Table.TransformColumnTypes(#"Added Custom",{{"Custom", type text}}),
    #"Filled Down" = Table.FillDown(#"Changed Type1",{"Custom"}),

    //Filter the value and custom columns to remove contaminant type from Value column and remove dates from Custom column
    #"Filtered Rows1" = Table.SelectRows(#"Filled Down", each ([Custom] = "Heavy Metals" or [Custom] = "Residual Solvents") and ([Value] <> "Heavy Metals" and [Value] <> "Residual Solvents")),

    //split substance from amount
    #"Split Column by Delimiter1" = Table.SplitColumn(#"Filtered Rows1", "Value", 
        Splitter.SplitTextByEachDelimiter({" "}, QuoteStyle.Csv, true), {"Substance", "Amount"}),
    //Filter for Solvents Table
    #"Filtered Rows2" = Table.SelectRows(#"Split Column by Delimiter1", each ([Custom] = "Heavy Metals")),
    #"Changed Type2" = Table.TransformColumnTypes(#"Filtered Rows2",{{"Amount", type number}}),
    
    //Group by Material and Substance, then extract the Max contaminant and Source
    #"Grouped Rows" = Table.Group(#"Changed Type2", {"Substance","Material", "Supplier"}, {
        {"Amount", each List.Max([Amount]), type number},
        {"Source", (t) => t[Attribute]{List.PositionOf(t[Amount],List.Max(t[Amount]))}, type text}
        }),
    #"Sorted Rows" = Table.Sort(#"Grouped Rows",{{"Substance", Order.Ascending}}),


    //PIVOT to compare suppliers
    #"Pivoted Column" = Table.Pivot(#"Sorted Rows", List.Distinct(#"Sorted Rows"[Supplier]), "Supplier", "Amount", List.Sum)
in
    #"Pivoted Column"
let
Source=Excel.CurrentWorkbook(){[Name=“Table1”]}[Content],
#“已更改类型”=表.转换列类型(来源,{{“材料”,类型text},{“残留溶剂”,类型text},{“RMQ”,类型text},{“COA”,类型text},{“技术数据表”,类型text}),
//将Time和null替换为空
#“替换值”=表.ReplaceValue(#“更改类型”、“00:00:00”、“替换文本”、“材料”、“RMQ”、“残留溶剂”、“技术数据表”、“COA”}),
#“替换值1”=表.ReplaceValue(#“替换值”,null,”,replace.ReplaceValue,{“材料”,“RMQ”,“残留溶剂”,“技术数据表”,“COA”}),
//修剪用户的所有空白
#“Power Trim”=表格.转换列(#“替换值1”、{“材料”、#“PowerTrim”、类型text}、{“残留溶剂”、#“PowerTrim”、类型text}、{“RMQ”、#“PowerTrim”、类型text}、{“COA”、#“PowerTrim”、类型text}、{“技术数据表”、#“PowerTrim”、类型text}),
//取消PIVOT以开发溶剂/金属/日期数据的单列
#“Unpivoted Other Columns”=表.UnpivotOtherColumns(#“Power Trim”、{“Material”、“Supplier”}、“Attribute”、“Value”),
//按换行方式拆分成行
#“按分隔符拆分列”=Table.ExpandListColumn(Table.TransformColumns)(#“取消拆分其他列”,
{{“Value”,Splitter.SplitTextByDelimiter(“#(lf)”,QuoteStyle.Csv),让itemType=(type nullable text)meta[Serialized.text=true],在类型{itemType}}}中,“Value”),
#“Trimmed Text”=Table.TransformColumns(#“按分隔符拆分列”,{{{“Value”,Text.Trim,键入Text}),
/滤出空白行
#“筛选行”=表格。选择行(#“修剪文本”,每个([Value]“和[Value]“未提供”),
//添加用于分隔表的自定义列
#“添加自定义”=Table.AddColumn(#“筛选行”,“自定义”,每个重试日期)。否则为FromText([Value])
如果[Value]=“重金属”或[Value]=“残留溶剂”或[Value]=“其他”,则[Value]否则为空,
#“Changed Type1”=Table.TransformColumnTypes(#“Added Custom”,{{{“Custom”,type text}),
#“Filled Down”=Table.filledown(#“Changed Type1”,{“Custom”}),
//过滤值列和自定义列,以从值列中删除污染物类型,并从自定义列中删除日期
#“过滤行1”=表格。选择行(#“填充”,每个行([自定义]=“重金属”或[自定义]=“残留溶剂”)和([值]“重金属”和[值]“残留溶剂”),
//分质分量
#“按分隔符拆分列1”=表.拆分列(#“筛选行1”,“值”,
Splitter.SplitTextByEachDelimiter({“”},QuoteStyle.Csv,true),{“物质”,“数量”}),
//溶剂表过滤器
#“筛选行2”=表格。选择行(#“按分隔符1拆分列”,每个([自定义]=“重金属”),
#“Changed Type2”=Table.TransformColumnTypes(#“Filtered Rows2”,{{{“Amount”,type number}),
//按材料和物质分组,然后提取最大污染物和来源
#“分组行”=表组(#“更改类型2”、{“物质”、“材料”、“供应商”}{
{“Amount”,每个List.Max([Amount]),键入number},
{“Source”,(t)=>t[Attribute]{List.PositionOf(t[Amount],List.Max(t[Amount]),键入text}
}),
#“排序行”=表.Sort(#“分组行”,{{“实质”,Order.升序}),
//重点比较供应商
#“数据透视列”=表.Pivot(#“排序行”,List.Distinct(#“排序行”[Supplier]),“Supplier”,“Amount”,List.Sum)
在里面
#“旋转柱”
  • 添加一个以零(0)开头的索引列
  • 添加自定义列:
  • 然后删除索引列
算法

  • 生成要求和的相关列名的列表。
    • 我们从该列表中排除前三个列名
    • 请注意,我们在为列名列表添加索引列之前参考了步骤。如果我们参考前面添加索引列的实际步骤,我们还必须删除最后一个列名
    • 选择相关列
    • {[Index]}
      将返回与索引号对应的记录
    • 将记录转换为列表并使用
      list.Max

再次感谢。很抱歉让您感到痛苦,但您是否可以建议我如何转换数据,使其保留/创建一列以包含供应商信息?虽然你的答案很好,但我希望表格最终会显示文档/来源,以及供应商(X、Y、Z等),以便能够轻松地将每个值追溯到原始数据。不用担心,不管怎样,你都帮了大忙。@Nick只需使用数据列表中最大金额的位置,即可在列标题列表中找到公司。
=List.Max(
Record.ToList(
Table.SelectColumns(#"Added Index",
List.RemoveFirstN(
    Table.ColumnNames(#"Pivoted Column"),3)){[Index]}))