首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >power查询-M语言-将列转换为行

power查询-M语言-将列转换为行
EN

Stack Overflow用户
提问于 2018-06-23 16:47:51
回答 2查看 731关注 0票数 0

我有一个电子表格,其中包含列名作为产品名称,数量,成本。

我想将它转换为包含产品名称、数量、成本的数据行。

请看下面关于我想要什么的图片。

在Power语言中处理这个问题的最佳方法是什么?

我不确定我是否只想把那些有刺激名称、数量和成本的列转起来?

谢谢

EN

回答 2

Stack Overflow用户

发布于 2018-06-24 15:25:10

有个办法..。

从这个表开始,作为Table1:

您可以选择Customer列和Un透视其他列以获得以下结果:

然后,您可以添加一个索引列(保持它的名称为Index),然后添加一个自定义列(保持它的名称为自定义),并使用if Text.EndsWith([Attribute],"Cost") then 1 else 0作为它的公式,以获得如下结果:

然后添加另一个自定义列..。将其命名为“总成本”,并输入#"Unpivoted Other Columns"[Value]{[Index]+(List.Count(#"Added Custom"[Custom])/List.Sum(#"Added Custom"[Custom]))}作为其计算公式:

上述两个步骤首先是根据成本在“价值”栏中的位置来确定T恤衫的相应成本,然后实际定位成本并将其记录在与各自T恤衫相同的线上。Index列提供行定位信息,而自定义列提供计数信息--包括总列表计数和带成本的行数。我使用计数信息来确定向下移动“值”列的索引位置的数量,以动态获取相关的成本值。

然后对属性列进行筛选,使用文本筛选器>不以.然后键入“成本”一词。所有以“成本”字结尾的属性条目的行都应该消失:

移除索引列和自定义列,并将属性列和值列分别重命名为Product和Quantity,以获得最终结果:

这是我的M码:

代码语言:javascript
复制
let
Source = Excel.CurrentWorkbook(){[Name="Table1"]}[Content],
#"Unpivoted Other Columns" = Table.UnpivotOtherColumns(Source, {"Customer"}, "Attribute", "Value"),
#"Added Index" = Table.AddIndexColumn(#"Unpivoted Other Columns", "Index", 0, 1),
#"Added Custom" = Table.AddColumn(#"Added Index", "Custom", each if Text.EndsWith([Attribute],"Cost") then 1 else 0),
#"Added Custom2" = Table.AddColumn(#"Added Custom", "Total Cost", each #"Unpivoted Other Columns"[Value]{[Index]+(List.Count(#"Added Custom"[Custom])/List.Sum(#"Added Custom"[Custom]))}),
#"Filtered Rows" = Table.SelectRows(#"Added Custom2", each not Text.EndsWith([Attribute], "Cost")),
#"Removed Columns" = Table.RemoveColumns(#"Filtered Rows",{"Index", "Custom"}),
#"Renamed Columns" = Table.RenameColumns(#"Removed Columns",{{"Attribute", "Product Name"}, {"Value", "Quantity"}})
in
#"Renamed Columns"
票数 0
EN

Stack Overflow用户

发布于 2018-06-25 15:34:31

这里的关键是旋转和不旋转。

从这张桌子开始,

选择右边的四列,然后单击Transform > Unpivot列以获得以下表:

现在创建一个自定义列,使用此公式对值进行分类。

代码语言:javascript
复制
if Text.EndsWith([Attribute], "Cost") then "Cost" else "Quantity"

我还在" Cost"列的末尾砍掉了Attribute部分。您可以转换>替换值并将" Cost"替换为空,也可以在分隔符" Cost"之前转换>提取>文本。

现在转到定制列(选择Value列作为值列选择),最后将Attribute列重命名为Product Name

以下是我所有步骤的M代码:

代码语言:javascript
复制
let
    Source = Table.FromRows(Json.Document(Binary.Decompress(Binary.FromText("i45WcknNK0stUnAuLS7Jz00tUtJRMjIGEoYmIJapqZ6pAYhnZKpnYKAUqxOt5JyRmZyYno+swdAQSJiagtUZgNQBeeYQDbEA", BinaryEncoding.Base64), Compression.Deflate)), let _t = ((type text) meta [Serialized.Text = true]) in type table [Customer = _t, #"Product Orange T-shirt" = _t, #"Product Blue T-shirt" = _t, #"Product Orange T-shirt Cost" = _t, #"Product Blue T-shirt Cost" = _t]),
    #"Changed Type" = Table.TransformColumnTypes(Source,{{"Customer", type text}, {"Product Orange T-shirt", Int64.Type}, {"Product Blue T-shirt", Int64.Type}, {"Product Orange T-shirt Cost", type number}, {"Product Blue T-shirt Cost", type number}}),
    #"Unpivoted Columns" = Table.UnpivotOtherColumns(#"Changed Type", {"Customer"}, "Attribute", "Value"),
    #"Added Custom" = Table.AddColumn(#"Unpivoted Columns", "Custom", each if Text.EndsWith([Attribute], "Cost") then "Cost" else "Quantity"),
    #"Replaced Value" = Table.ReplaceValue(#"Added Custom"," Cost","",Replacer.ReplaceText,{"Attribute"}),
    #"Pivoted Column" = Table.Pivot(#"Replaced Value", List.Distinct(#"Replaced Value"[Custom]), "Custom", "Value", List.Sum),
    #"Renamed Columns" = Table.RenameColumns(#"Pivoted Column",{{"Attribute", "Product Name"}})
in
    #"Renamed Columns"
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51003201

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档