Используя Power Query
,
- Я создал два списка с диспозициями и статусом, перечисленными в порядке приоритета.
- ввод этих двух списков выполняется вручную. Все остальное можно сделать из GUI
- Затем я добавил два настраиваемых столбца с соответствующими рейтингами с помощью функции
List.PositionOf
. - Группа строки по
Account Name
и агрегирование по Minimum
, что будет наивысшим приоритетом в каждом из списков статуса и диспозиций. - Используйте тип поиска, чтобы вспомнить фактическое имя статуса и диспозиции.
- Обратите внимание, что сравнения списков будут чувствительны к регистру, поэтому я немного изменил регистр списков, думая, что если они вводятся вручную, могут быть некоторые различия. Если это не так, вы можете это изменить.
M-код
let
Source = Excel.CurrentWorkbook(){[Name="Table1"]}[Content],
dispOrder = {"pending","upgrade underway","upgrade required","proposal created","waiting","no action"},
statusOrder = {"upgrade planned","waiting on customer","in progress","complete"},
#"Changed Type" = Table.TransformColumnTypes(Source,{{"Account Name", type text}, {"Area", type text}, {"Name", type text}, {"Disposition", type text}, {"Status", type text}}),
#"Added Custom" = Table.AddColumn(#"Changed Type", "Custom", each Text.Lower([Disposition])),
#"Added Custom1" = Table.AddColumn(#"Added Custom", "dispOrder", each List.PositionOf(dispOrder,[Custom])),
#"Added Custom2" = Table.AddColumn(#"Added Custom1", "Custom.1", each Text.Lower([Status])),
#"Added Custom3" = Table.AddColumn(#"Added Custom2", "statusOrder", each List.PositionOf(statusOrder,[Custom.1])),
#"Removed Columns" = Table.RemoveColumns(#"Added Custom3",{"Custom", "Custom.1"}),
#"Grouped Rows" = Table.Group(#"Removed Columns", {"Account Name"}, {{"StatusRank", each List.Min([statusOrder]), type number}, {"DispRank", each List.Min([dispOrder]), type number}}),
#"Added Custom4" = Table.AddColumn(#"Grouped Rows", "Disposition", each Text.Proper(dispOrder{[DispRank]})),
#"Added Custom5" = Table.AddColumn(#"Added Custom4", "Status", each Text.Proper(statusOrder{[StatusRank]})),
#"Removed Columns1" = Table.RemoveColumns(#"Added Custom5",{"StatusRank", "DispRank"})
in
#"Removed Columns1"
введите описание изображения здесь
Одно из предположений в приведенном выше коде состоит в том, что каждая позиция для Диспозиции и Статус имеет действительную запись.
В своих комментариях вы указываете, что у вас может быть элемент, который пусто. Если пустое поле должно иметь "самый низкий" приоритет, вам просто нужно добавить null
в массивы ...Order
.
В дополнение к этому, если вы хотите проверить недопустимые записи (т. Е. Записи, которые не являются пустыми, но их нет в списке приоритетов, вы можете использовать try … otherwise …
Существует множество возможных вариантов того, что делать с недопустимыми и / или пустыми записями, но это должно дать вам некоторое представление об обработке ошибок .
Например:
…
dispOrder = {"pending","upgrade underway","upgrade required","proposal created","waiting","no action", null},
statusOrder = {"upgrade planned","waiting on customer","in progress","complete", null},
…
#"Added Custom4" = Table.AddColumn(#"Grouped Rows", "Disposition", each try Text.Proper(dispOrder{[DispRank]}) otherwise "INVALID ENTRY"),
#"Added Custom5" = Table.AddColumn(#"Added Custom4", "Status", each try Text.Proper(statusOrder{[StatusRank]}) otherwise "INVALID ENTRY"),
…