Условное форматирование на основе списков - PullRequest
0 голосов
/ 30 сентября 2019

Я новичок в M и хотел бы создать оператор if, then, else на основе значений внутри списка.

В основном у меня есть 4 списка:

let
    FoodCompanies = {"Nestlé", "Pepsico", "Unilever"},
    ClothingCompanies = {"Nike", "Ralph Lauren", "Old Navy"},
    TechCompanies = {"Apple", "Samsung", "IBM"},
    AllCompanies = {FoodCompanies,ClothingCompanies,TechCompanies}

Теперь я хочу создать условный столбец, который проверяет наличие другого столбца (тега), если одно из значений присутствует, и на основе этого делаетрасчет.

| ItemId| DateOfSale | tag                     | 
| 001   | 01/01/1980 | Nestlé                  |
| 002   | 01/01/1980 | Nike, Apple             |
| 003   | 01/01/1980 | Unilever, Old Navy, IBM |
| 004   | 01/01/1980 | Samsung                 |

Итак ... Я начинаю так:

#"Added Conditional Column" = Table.AddColumn(#"Renamed Columns3", "type", each 

Отдельные значения

if [tag] = "" then "Empty tag" 
else if [tag] = "Nestlé" then "Nestlé"
else if [tag] = "Nike" then "Nike"
...

Несколькозначения

Это для нескольких значений, я не знаю, как создать логику

Если тег содержит более 1 значения из FoodCompanies, но не из ClosthingCompanies или Techcompanies, я хочу, чтобы этоbe "FoodCompanies"

Если тег содержит более 1 значения из ClothingCompanies, но не из FoodCompanies или Techcompanies, я хочу, чтобы он был "ClothingCompanies"

Если тег содержит 2 значения из AllCompanies, он должен быть "MixedCompanies "

, если тег содержит все значения из AllCompanies, это должно быть" AllofThem "

...

Кто-нибудь может помочь мне в пути? Я бы сделал это как

else if List.Count(FoodCompanies) > 1 and ( List.Count(ClothingCompanies) < 1 or List.Count(Techcompanies) < 1)  then "FoodCompanies"

, но как мне оценить его по значению тега?

1 Ответ

0 голосов
/ 30 сентября 2019

Вот один из подходов, который преобразует ваш список компаний в таблицу, сопоставляет значения тегов, фильтрует результаты, а затем определяет выходные данные:

#"Renamed Columns3" = //your previous step here
fnMatchingList = (MyList) =>
    let
        AllLists = #table(type table [#"ListName"=text, #"ListValues"=list], 
            {{"FoodCompanies",{"Nestlé", "Pepsico", "Unilever"}},
             {"ClothingCompanies", {"Nike", "Ralph Lauren", "Old Navy"}},
             {"TechCompanies",{"Apple", "Samsung", "IBM"}}}),
        FullList = Table.ExpandListColumn(AllLists, "ListValues"),
        Match = Table.AddColumn(FullList, "Match", each List.Contains(MyList,[ListValues])),
        Filtered = Table.SelectRows(Match, each ([Match] = true)),
        Output = if Table.RowCount(Filtered) = 1 then Filtered{0}[ListValues] else 
            if List.Distinct(Filtered[ListName]) = List.Distinct(FullList[ListName]) then "AllCompanies" else 
            Text.Combine(List.Distinct(Filtered[ListName]),", ")
        in
            Output,
#"Added Matching List" = Table.AddColumn(#"Previous Step", "taglist", each if [tag] = null or [tag] = "" then "(Empty Tag)" else fnMatchingList(Text.Split([tag],", ")))

Редактировать : помочьпонимание, вот отдельный запрос, который вы можете выполнить, чтобы увидеть, что на самом деле делает функция:

let
    MyList = {"Pepsico", "Nike"},
    AllLists = #table(type table [#"ListName"=text, #"ListValues"=list], 
        {{"FoodCompanies",{"Nestlé", "Pepsico", "Unilever"}},
         {"ClothingCompanies", {"Nike", "Ralph Lauren", "Old Navy"}},
         {"TechCompanies",{"Apple", "Samsung", "IBM"}}}),
    FullList = Table.ExpandListColumn(AllLists, "ListValues"),
    Match = Table.AddColumn(FullList, "Match", each List.Contains(MyList,[ListValues])),
    Filtered = Table.SelectRows(Match, each ([Match] = true)),
    Output = if Table.RowCount(Filtered) = 1 then Filtered{0}[ListValues] else 
        if List.Distinct(Filtered[ListName]) = List.Distinct(FullList[ListName]) then "AllCompanies" else 
        Text.Combine(List.Distinct(Filtered[ListName]),", ")
in
    Output
...