Сопоставьте и перечислите значения в списке, включая критерии нескольких столбцов

0 А Б С Д Э Ф г ЧАС я Дж К л М Н 1 Продукты Магазин 2023-С 2023-М 2024-С 2024-М 2 3 Продукт А магазин3 80 2% 500 22% ColCrit1 ColCrit2 искомый_массив 4 Продукт Б магазин2 320 23% 180 60% Продукт Д магазин1 2024-е 5 Продукт Б магазин1 90 8% 300 36% Продукт Г магазин3 return_array 6 Продукт С магазин3 500 15% 657 16% Продукты 7 Продукт Д магазин1 160 17% 500 15% 8 Продукт Д магазин1 500 30% 600 8% список соответствовать 9 Продукт Д магазин1 130 4% 300 4% 830 Продукт Г 10 Продукт Е магазин2 75 10% 450 10% 600 Продукт Д 11 Продукт F магазин4 60 8% 370 4% 600 Продукт Г 12 Продукт F магазин1 500 11% 850 4% 500 Продукт Д 13 Продукт Г магазин3 350 8% 150 15% 300 Продукт Д 14 Продукт Г магазин3 60 47% 600 7% 300 Продукт Г 15 Продукт Г магазин3 90 25% 830 35% 300 Продукт Г 16 Продукт Г магазин2 390 9% 325 13% 150 Продукт Г 17 Продукт Г магазин3 170 30% 300 9% 18 Продукт Г магазин3 320 5% 300 12% 19 Продукт Н магазин2 935 27% 230 16% 20 Продукт I магазин3 134 18% 600 42%

В Range K9:K16 перечислены все значения из Column H, которые соответствуют критериям столбца в Range K4:K6 и Range L4:L6.
В Range L9:L16 я хочу добавить значение столбца на основе переменной return_array, введенной в Cell N6.

Что касается этого вопроса, мне удалось разработать следующую формулу:

=IFERROR(LET(
     a; K9:K17;
     b; A1:I1;
     c; A3:I20;
     d; XLOOKUP(N4;b;c;"");
     MAP(a;LAMBDA(α; @DROP(TOCOL(FILTER(IFS(d=α;IF(c=0;x;c));N6=b);3);
     COUNTIF(K9:α;α)-1))));"")

Это решение работает почти идеально.


Однако сейчас проблема заключается в значениях Cell H3 и Cell H5. Эти значения равны некоторым значениям в Range K9:K16.
Поэтому они учитываются в приведенной выше формуле, а список в Range L9:L16 неверен.

Я думаю, что чтобы решить эту проблему, критерии столбцов в Range K4:K6 и Range L4:L6 нужно каким-то образом добавить к формуле выше.

У вас есть идеи, как это сделать?

Преобразование HTML-таблицы в профессиональный документ Excel
Преобразование HTML-таблицы в профессиональный документ Excel
Это самый простой способ создания Excel из HTML-таблицы.
Импорт excel в laravel в базу данных
Импорт excel в laravel в базу данных
Здравствуйте, дорогой читатель, в этой статье я расскажу практическим и быстрым способом, как импортировать файл Excel в вашу базу данных с помощью...
1
0
97
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Вы можете использовать COUNTIFS для фильтрации массива поиска и возврата массива:

=LET(
    included, COUNTIFS(K4:K5, A3:A20, L4:L5, C3:C20),
    lookup_array, FILTER(XLOOKUP(N4, A1:I1, A3:I20, ""), included, ""),
    return_array, FILTER(XLOOKUP(N6, A1:I1, A3:I20, ""), included, ""),
    selected, K9:K16,
    MAP(
        selected,
        LAMBDA(x,
            LET(
                filtered, FILTER(return_array, lookup_array = x, ""),
                current_count, COUNTIF(K9:x, x),
                INDEX(filtered, MIN(current_count, ROWS(filtered)), 1)
            )
        )
    )
)

Европейский (;) формат:

=LET(
    included; COUNTIFS(K4:K5; A3:A20; L4:L5; C3:C20);
    lookup_array; FILTER(XLOOKUP(N4; A1:I1; A3:I20; ""); included; "");
    return_array; FILTER(XLOOKUP(N6; A1:I1; A3:I20; ""); included; "");
    selected; K9:K16;
    MAP(
        selected;
        LAMBDA(x;
            LET(
                filtered; FILTER(return_array; lookup_array = x; "");
                current_count; COUNTIF(K9:x; x);
                INDEX(filtered; MIN(current_count; ROWS(filtered)); 1)
            )
        )
    )
)

Я нахожусь в Европе, и не все используют ";", но это, вероятно, связано с тем, что я работаю с представителями 90 национальностей, обучая их Excel...

Solar Mike 07.07.2024 12:21

Не уверен, какая терминология правильная. Я просто назову это ";" формат с этого момента.

rachel 07.07.2024 12:22

Эй, не могли бы вы улучшить это, чтобы элементы в K4:K5 не находились в возвращаемом массиве? Например, если Product G написано с ошибкой, то для второго 600 в selectedfiltered вернет только один 600, а INDEX(filtered, current_count = 2, 1) приведет к ошибке.

nkalvi 07.07.2024 12:54

@nkalvi, изменено на INDEX(filtered, MIN(current_count, ROWS(filtered)), 1)

rachel 07.07.2024 13:14

Надеюсь, эта ссылка работает: 1drv.ms/x/s!AjsOQOZMdif-kjP8aNLIWu1hx-DJ?e=ScVKbR

rachel 07.07.2024 13:41

@rachel, с INDEX(filtered, MIN(current_count, ROWS(filtered)), 1) результаты тоже неверны, хотя ошибок нет. Например, он дает 6 строк «Продукт D» с K4:K6 = (Продукт D, Продукт).

nkalvi 07.07.2024 13:46

@nkalvi, я помню, в своем предыдущем посте она сказала, что частота «выбранных данных» будет такой же, как частота исходных данных. но если вас это очень беспокоит, вы можете использовать if (ROWS(filtered)<current_count, "", index(filtered, current_count,1))

rachel 07.07.2024 15:47

Прошу прощения, @rachel, я не рассматривал это в контексте предыдущих публикаций. Нет, меня это совершенно не беспокоит. Мне нравится откровенность ваших ответов.

nkalvi 07.07.2024 17:38
Ответ принят как подходящий

=SORT(FILTER(CHOOSECOLS(A3:I20,XMATCH(N4,A1:I1),XMATCH(N6,A1:I1)),COUNTIFS(K4:K6,A3:A20,L4:L6,C3:C20)),,-1)

Простой COUNTIFS можно использовать в качестве критерия фильтра для FILTER в столбцах, которые вы хотите вернуть с помощью CHOOSECOLS, включая XMATCH.

Формула почти работает. Однако, когда, например, colcrit1 (K4:K6) или colcrit2 (L4:L6) пуст, выдается ошибка #CALC! ошибка.

Michi 07.07.2024 15:03

Да, потому что нет аргументов для фильтрации. Чего бы вы ожидали в таком случае? Пустой? =SORT(FILTER(CHOOSECOLS(A3:I20,XMATCH(N4,A1:I1),XMATCH(N6,A1‌​:I1)),COUNTIFS(K4:K6‌​,A3:A20,L4:L6,C3:C20‌​),""),,-1)

P.b 07.07.2024 15:05

Спасибо за ответ. Понял вашу точку зрения. Открыл для этого новый вопрос. stackoverflow.com/questions/78717418/…

Michi 07.07.2024 15:25

Продлеваю от П.б

=LET(
    filtered, FILTER(
        CHOOSECOLS(
            A3:I20,
            XMATCH(N4, A1:I1),
            XMATCH(N6, A1:I1)
        ),
        COUNTIFS(K4:K6, A3:A20, L4:L6, C3:C20)
    ),
    freq, LAMBDA(arr,
        MAP(
            SEQUENCE(ROWS(arr)),
            LAMBDA(i,
                SUM(--(TAKE(arr, i) = INDEX(arr, i, )))
            )
        )
    ),
    TOCOL(
        XLOOKUP(
            K9:K16 & " " & freq(K9:K16),
            CHOOSECOLS(filtered, 1) & " " &
                freq(CHOOSECOLS(filtered, 1)),
            CHOOSECOLS(filtered, 2)
        ),
        2
    )
)

Я упустил аргумент result_array, являющийся динамическим вводом. Обновил это в своем ответе.

P.b 07.07.2024 14:03

Ах да, я тоже это пропустил. спасибо @P.b. Я обновлю ответ, чтобы отразить изменения :) Кстати, есть ли у вас более короткий метод для получения текущего подсчета?

nkalvi 07.07.2024 14:15

Проведение подсчета чего? (СКАНИРОВАНИЕ или КАРТА будут хорошим выбором оружия?)

P.b 07.07.2024 14:25

Текущий подсчет значений, например 600 1, 600 2, 400 1, 400 2 и т. д. Здесь я использую MAP вместе с SUM + IF. Поскольку у вас и @JvdV есть много кратких методов, мне было интересно узнать о других компактных способах.

nkalvi 07.07.2024 14:41

Спасибо за комплимент. Трудно сказать без данных, но что-то в этом роде: =let(r,range,map(r,lambda(x,sum(n(@r:x=x)))))

P.b 07.07.2024 14:47

Спасибо — использование @ выдает предупреждение на Mac; Я сократил СУММУ + ЕСЛИ до СУММ только в своем ответе.

nkalvi 07.07.2024 15:13
@r будет относиться к началу диапазона. Это может быть A2, например: =let(r,A2:A10,map(r,lambda(x,sum(n(A2:x=x)))))
P.b 07.07.2024 15:18

Знаю, я опаздываю, и причина в том, что я совсем пропустила опечатку в ColCrit1, как П.б Сэр, так и Рейчел (данные взяла у нее, поделилась ссылкой на Excel в комментариях), уточнила проблема в контексте ОП.

У меня была та же идея использовать COUNTIFS(), но поскольку я боролся с опечаткой, о которой я не подозревал, или из-за моей ошибки, проигнорировав ее, поэтому я не мог публиковать сообщения в режиме реального времени, а также вместо использования COUNTIFS(), который уже использовался во всех выше ответы, вот моя альтернатива сохранению исходной формулы нетронутой, как в OP, использует комбинацию XMATCH()+ISNA()+1, также известную XMATCH()+ISNUMBER():


• Формула, используемая в ячейке L9

=LET(
     a, K9:K16,
     b, A1:I1,
     c, A3:I20,
     d, XLOOKUP(N4,b,c,""),
     MAP(a,LAMBDA(α, @DROP(TOCOL(FILTER(IFS((d=α)*
                    (1-ISNA(XMATCH(A3:A20,K4:K5)+XMATCH(C3:C20,L4:L5))),
                    IF(c=0,x,c)),N6=b,""),3),
     COUNTIF(K9:α,α)-1))))

Формула почти работает. Однако, когда, например, colcrit1 (K4:K6) или colcrit2 (L4:L6) пуст, выдается ошибка #CALC! ошибка.

Michi 07.07.2024 15:00

@Michi, так какой же должен быть результат в этом сценарии, ты хочешь вернуть пустое значение?

Mayukh Bhattacharya 07.07.2024 15:04

Понял вашу точку зрения. Открыл для этого новый вопрос. stackoverflow.com/questions/78717418/…

Michi 07.07.2024 15:25

Другие вопросы по теме