Выберите атрибуты клиента, которые соответствуют действительности, и верните их в определенном порядке. - PullRequest
0 голосов
/ 20 июня 2019

Я использую Excel 2010 и имею для каждого customer id определенные события, которые могут быть true или false.

Кроме того, пользователь может настроить порядок, в котором истинные события дляИдентификатор клиента должен быть возвращен.

Так, например, у меня есть следующие клиенты со следующими событиями:

| Customer ID   | Event 1   | Event 2   | Event 3   | Event 4   |
|-------------  |---------  |---------  |---------  |---------  |
| 1             | TRUE      | FALSE     | TRUE      | FALSE     |
| 2             | FALSE     | TRUE      | FALSE     | FALSE     |
| 3             | TRUE      | TRUE      | TRUE      | TRUE      |
| 4             | FALSE     | TRUE      | FALSE     | FALSE     |
| 5             | TRUE      | FALSE     | TRUE      | TRUE      |
| 6             | TRUE      | TRUE      | FALSE     | FALSE     |
| 8             | FALSE     | FALSE     | TRUE      | TRUE      |
| 9             | TRUE      | TRUE      | FALSE     | TRUE      |

Во-вторых, порядок, в котором все истинные события должны быть возвращены, может иметь приоритет:

| Events    | Prioritized (1...most important - 4... least important)   |
|---------  |---------------------------------------------------------  |
| Event 3   | 1                                                         |
| Event 1   | 2                                                         |
| Event 2   | 3                                                         |
| Event 4   | 4                                                         |

Так, например, для клиента с идентификатором 3 должны быть указаны следующие выходные данные и порядок событий:

enter image description here

Для клиента с идентификатором 8 должны быть указаны следующие выходные данные и порядок событий:

enter image description here

Мой пример Excel выглядит следующим образом:

enter image description here

Я думал об использовании нескольких IFs, однако в действительности у меня есть около 100 events и 10.000 customers.

Любые предложения, как реализовать это в Excel?

Я ценю ваши ответы!

Ответы [ 2 ]

3 голосов
/ 20 июня 2019

Используйте эту формулу массива:

=IFERROR(INDEX($H$3:$H$6,AGGREGATE(15,7,(ROW($H$3:$H$6)-MIN(ROW($H$3:$H$6))+1)/(INDEX(INDEX(B:E,MATCH($A$19,A:A,0),0),N(IF({1},MODE.MULT(IF({1},MATCH($H$3:$H$6,$B$2:$E$2,0)*{1,1})))))=TRUE),ROW(1:1))),"")

Будучи формулой массива, вы должны поместить ее в B19, нажать Ctrl-Shift-Enter и затем скопировать вниз.

Единственное предостережение - этосписок заказов будет отсортирован по порядку.Это касается не числа в столбце I, а порядка в столбце H, в котором перечислены события.

N(IF({1},MODE.MULT(IF({1},MATCH($H$3:$H$6,$B$2:$E$2,0)*{1,1}))))) создает массив относительных номеров столбцов (B: E) в порядке их перечисления вСтолбец H.

INDEX(B:E,MATCH($A$19,A:A,0),0) возвращает строку, в которой найден идентификатор клиента.

INDEX(INDEX(B:E,MATCH($A$19,A:A,0),0),N(IF({1},MODE.MULT(IF({1},MATCH($H$3:$H$6,$B$2:$E$2,0)*{1,1}))))) возвращает полный массив значений TRUE / FALSE из правильной строки в правильном порядке.

Затем агрегат возвращает первый относительный номер столбца, который имеет значение true, а затем второй и третий ... по мере их перетаскивания во внешний индекс.Который затем возвращает правильное значение из столбца H.

Если при правильном k не найдено True, то он возвращает ошибку и IFERROR возвращает пустую строку.

enter image description here

enter image description here

2 голосов
/ 20 июня 2019

Я предложил вариант, который не идеален, но должен работать.

Прежде всего, я бы преобразовал вашу таблицу в список, чтобы она выглядела так:

enter image description here

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

enter image description here

Значение будет "id" _ "priority", используя формулу (для ячейки B3):

 =IF(E3=TRUE,C3&"_"&VLOOKUP(D3,$G$3:$H$7,2,FALSE),"")

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

enter image description here

Где формула для ячейки L3 (событие с максимальным приоритетом)быть:

=+IF(ISERROR(VLOOKUP($L$2&"_"&K3,$B$3:$D$8,3,FALSE)),"",VLOOKUP($L$2&"_"&K3,$B$3:$D$8,3,FALSE))
...