根据其他列的值动态更改字段/列的名称

时间:2020-03-26 14:11:07

标签: powerbi dax powerquery

我目前有一张类似于下面的表格(我知道这是一种奇怪的逻辑): Example Table

我想让这些列显示以下内容: Desired Result

由于我从自动获取的数据源中将前五列更改为适当的年份,所以我希望可以根据前五列中的值将“值”列设置为具有动态名称。

在DAX或Power Query中解决此问题将对您有所帮助。 谢谢

2 个答案:

答案 0 :(得分:1)

使用Power Query的一种方法可能是实施一些步骤,例如:

  1. 获取表中最右边5列的名称(应该为您提供5个字符串的列表,所有字符串都以" Value"结尾)。
  2. 对于每个列名称,从末尾修剪" Value"(这应该为您提供5个不同字符串的列表,所有这些都应该是表中列的名称)。
  3. 对于每个修剪的列名,在该列的第一行中查找值(这将为您提供5个不同的字符串的列表,它们将是新的列名)。

下面的代码基本上尝试完成上述操作。


let
    someTable = Table.FromRows({
        {2018, 2019, 2020, 2021, 2022, 123, 355, 744, 234, 685},
        {2018, 2019, 2020, 2021, 2022, 59, 1129, 254, 774, 490}
    }, type table [
        PFY2 = Int64.Type,
        PFY = Int64.Type,
        CFY = Int64.Type,
        NFY = Int64.Type,
        NFY2 = Int64.Type,
        PFY2 Value = Int64.Type,
        PFY Value = Int64.Type,
        CFY Value = Int64.Type,
        NFY Value = Int64.Type,
        NFY2 Value = Int64.Type
    ]),
    oldNames = List.LastN(Table.ColumnNames(someTable), 5),
    columnsContainingNewNames = List.Transform(oldNames, each Text.BeforeDelimiter(_, " Value", {0, RelativePosition.FromEnd})),
    newNames = List.Transform(columnsContainingNewNames, each Text.From(Table.Column(someTable, _){0})),
    renamed = Table.RenameColumns(someTable, List.Zip({oldNames, newNames}))
in
    renamed

一些问题:

  • 为简单起见,我已经对5进行了硬编码,但是如果您的表可以更改(这样,您需要重命名的列可能并不总是最后5个),那么更动态的方法可能类似于:oldNames = List.Select(Table.ColumnNames(someTable), each Text.EndsWith(_, " Value"))。这将选择所有以" Value"结尾的列名,包括您可能不想重命名的所有列名,但这只是一个示例,您可以根据需要调整谓词函数。

  • 如果表为空,那么我认为在第一行中查找值时会出错(因为在这种情况下不会出现第一行)。

    < / li>

答案 1 :(得分:0)

我不认为可以动态地重命名列

但是,您可以采用一种解决方法:

您可以使用当前日期创建5个小节,并找出所有年份

您可以将这些度量添加到表/矩阵并将其覆盖在主表上