如果我已经很好地理解了目标,那么您正在尝试进行嵌套的 unpivot(标准化或融化)。您正在嵌套两个属性:Scents 和 Sizes,但听起来可能还有更多属性 - 如果是这样,此方法可以概括为以下逻辑:
您正在按气味对尺寸进行反透视,然后按名称对结果进行反透视除了气味可以为空白。我们会更清楚一点。
如果这是输入数据:
那么这将是预期的输出结果删除了空白尺寸:
请注意,Rust Remover 没有气味/口味,但包括在内,
而根据上述规则删除空白大小的行。
在这种情况下,我看到了两种方法(不包括 VBA):
-
PowerQuery - 需要 Excel for Windows 2010+
-
动态数组公式 - Windows 或 Mac 需要 Excel 2019 或 365
由于 PowerQuery 非常简单,我将首先提出该建议。如果它对您不起作用,那么动态数组方法可能会很有趣,如果您有正确的 Excel 版本,但构建和测试需要更多时间(在我这边)。
电源查询方法
这可能看起来很吓人,但它需要的时间很少,只是很多
的点击。 5 分钟 - 最高
首先,将上面的表格转换为 Excel 表格 - 您可以单击其中的任意位置并按 CTRL t。它会询问您的表格是否有标题 - 是的,有。
现在转到表格设计标签,您可以在左侧重命名表格。我将其命名为 prodTable。
现在转到数据标签并点击From Range/Table。
这将打开 Power Query 编辑器,应该如下所示:
我只是想把 PowerQuery M 语言脚本贴在这里,让你把它放到你的机器上,但是如果你的表与我的模型不匹配,它就会失败,所以我们需要显示步骤。
1) Unpivot Scents
按住 CTRL 并选择气味列,然后在 转换选项卡中选择 Unpivot Columns。
双击该列上的值标题并将其重命名为“气味”。右键单击“属性”列并将其删除。
2) 反透视尺寸
现在对尺寸重复这些步骤。按住 CTRL 并选择大小列,然后在 转换选项卡中选择 Unpivot Columns。
双击该列上的值标题并将其重命名为“尺寸”。右键单击“属性”列并将其删除。
此时,你已经有了你所描述的,
但是你说你想要一个文本连接的名字,所以让我们在这里添加:
3) 创建合并名称
按住 CTRL 并按照您希望它们出现在文本连接中的顺序选择三列。然后在添加列标签中选择合并列。
它会询问你想要什么分隔符——我只是使用了竖线字符。它还会询问您要为该列命名什么 - 我选择了 SKU 名称。
4) 将其加载到 Excel 中
现在,您只需将其移回 Excel。转到主页标签并选择关闭并加载到。
然后告诉它您要将其加载到新工作表中 - 这是最简单的。
现在您将拥有一个名为 prodTable 的新工作表,其中将包含您转换后的产品表。这都是一次性的设置。从现在开始,当用户创建新组合时,您只需要通过右键单击它并刷新来刷新表 - PowerQuery 将执行您刚刚创建的 M 脚本,并将根据用户的输入生成所有 SKU .
如果您有 Excel for Mac 或者您希望它基于公式,那么请在 cmets 中大喊大叫。我知道使用动态数组执行此操作的唯一方法需要 Excel 2019,因为它将严重依赖 SEQUENCE 和 LET。我已经完成了 unpivots/melts,但是嵌套的 melts 需要一些思考。
另一种方法
这是一个 M 脚本,您可以将其加载到 PQ 高级编辑器中,基本上可以在没有气味/口味但有大小的情况下为您提供所需的内容。它不能处理您想要的所有嵌套属性,不幸的是,每次添加属性时都必须重写它,但它让您了解该方法:
let
Source = Excel.CurrentWorkbook(){[Name="prodTable"]}[Content],
#"Changed Type" = Table.TransformColumnTypes(Source,{{"Name", type text}, {"Scent 1", type text}, {"Scent 2", type text}, {"Size 1", type text}, {"Size 2", type text}}),
#"Replaced Value" = Table.ReplaceValue(#"Changed Type",null,"WASNULL",Replacer.ReplaceValue,{"Scent 1"}),
#"Unpivoted Columns" = Table.UnpivotOtherColumns(#"Replaced Value", {"Name", "Size 1", "Size 2"}, "Attribute", "Value"),
#"Renamed Columns" = Table.RenameColumns(#"Unpivoted Columns",{{"Value", "Scents"}}),
#"Removed Columns" = Table.RemoveColumns(#"Renamed Columns",{"Attribute"}),
#"Unpivoted Columns1" = Table.UnpivotOtherColumns(#"Removed Columns", {"Name", "Scents"}, "Attribute", "Value"),
#"Renamed Columns1" = Table.RenameColumns(#"Unpivoted Columns1",{{"Value", "Sizes"}}),
#"Removed Columns1" = Table.RemoveColumns(#"Renamed Columns1",{"Attribute"}),
#"Replaced Value1" = Table.ReplaceValue(#"Removed Columns1","WASNULL",null,Replacer.ReplaceValue,{"Scents"}),
#"Inserted Merged Column" = Table.AddColumn(#"Replaced Value1", "SKU Name", each Text.Combine({[Name], [Scents], [Sizes]}, "|"), type text)
in
#"Inserted Merged Column"
我试图使属性动态化,但是如果不进行大量 ETL,这会变得很困难。不知何故,你的目标似乎触手可及。您生成所有可能组合的想法可能会奏效,但需要进行大量设置才能实现您想要的规则。