Динамическое изменение имени поля / столбца на основе значения другого столбца - PullRequest
0 голосов
/ 26 марта 2020

В настоящее время у меня есть таблица, подобная приведенной ниже (я знаю, что это нечетная логика c): Example Table

Я бы хотел, чтобы в столбцах вместо этого отображались следующее: Desired Result

Поскольку источник данных, из которого я получаю это, автоматически меняет первые пять столбцов на соответствующий год, я надеялся, что смогу установить для столбцов «Значение» динамические значения. c имен, основанных на значениях, найденных в первых пяти столбцах.

Любая помощь будет полезна при решении этой проблемы в DAX или Power Query. Спасибо

Ответы [ 2 ]

1 голос
/ 26 марта 2020

Один из подходов с использованием 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), тогда более динамичный подход c может выглядеть примерно так: oldNames = List.Select(Table.ColumnNames(someTable), each Text.EndsWith(_, " Value")). При этом будут выбраны все имена столбцов, заканчивающиеся на " Value", включая имена, которые вы, возможно, не захотите переименовывать, но это всего лишь пример, и вы можете настроить функцию предиката при необходимости.

  • Если ваша таблица пуста, то, я думаю, вы получите ошибку при поиске значения в первой строке (поскольку в таких обстоятельствах не будет первой строки).

0 голосов
/ 26 марта 2020

Я не думаю, что в любом случае есть возможность динамически переименовывать столбец

Однако у вас может быть обходной путь:

Вы можете создать 5 мер, используя текущую дату, и рассчитать все годы

Вы можете добавить эти меры в таблицу / матрицу и наложить их на основной стол

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...