Какой лучший способ репликации суммифов, кроме создания формулы массива?

У меня есть следующий набор данных:

и у меня есть следующая таблица:

то, что я хотел бы сделать, это создать формулу массива в таблице, которая устранила бы необходимость во многих формулах суммирования (например, =SUMIFS(D$10:D$18,$A$10:$A$18,$A3,$B$10: $B$18,"y",$C$10:$C$18,"y")), которую нужно будет перетащить вдоль и вниз, чтобы в итоге получилось следующее:

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

Ответы 1

Ответ принят как подходящий

Попробуйте использовать MAKEARRAY() --> просто и понятно:


=MAKEARRAY(ROWS(A13:A15),COLUMNS(B12:M12),LAMBDA(r,c,
 SUM((INDEX(A13:A15,r)=A2:A10)*(B2:B10 = "Y")*(C2:C10 = "Y")*(INDEX(B12:M12,c)=D1:O1)*D2:O10)))

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

=LET(
     _Data, DataTable[#All],
     _Name, DROP(TAKE(_Data,,1),1),
     _Headers, DROP(TAKE(_Data,1),,3),
     _Uniq, UNIQUE(_Name),
     _Output, MAKEARRAY(ROWS(_Uniq), COLUMNS(_Headers), LAMBDA(r,c,
     SUM((INDEX(_Uniq,r)=_Name)*(INDEX(_Headers,c)=_Headers)*
     (INDEX(DROP(_Data,1),,2) = "Y")*(INDEX(DROP(_Data,1),,3) = "Y")*DROP(_Data,1,3)))),
     VSTACK(HSTACK(A1,_Headers),HSTACK(_Uniq,_Output)))

Если применимо, можно также использовать GROUPBY():


=VSTACK(HSTACK(A1,D1:O1),
 GROUPBY(A2:A10,D2:O10,SUM,,1,,BYROW(B2:C10 = "Y",AND)))

После множества проб и ошибок выяснилось, что этот вариант быстрее и эффективнее остальных:

=LET(
     _Conditions, MMULT(N(Conditions = "Y"),{1;1})>1,
     _Filter, FILTER(HSTACK(IDData,Vals),_Conditions,""),
     _Name, TAKE(_Filter,,1),
     _Uniq, UNIQUE(_Name),
     _SumVals, MMULT(N(_Uniq=TOROW(_Name)),DROP(_Filter,,1)),
     IFNA(INDEX(_SumVals,XMATCH(ID,_Uniq),B1:M1),0))

Спасибо. Мне не удалось заставить работать ETA Lambda, и у меня еще нет Groupby. Остальные работали с небольшими наборами данных, но, увы, не с тем размером данных, который у меня есть (около 50 тыс. строк), поскольку мой ноутбук постоянно ломался. Возможно, мне придется переосмыслить, как я это делаю

andy leary 10.07.2024 09:08

@andyleary, чтобы иметь GROUPBY(), вам нужно будет включить программу предварительной оценки Office, а также ETA Хорошо, я попробую другой вариант!

Mayukh Bhattacharya 10.07.2024 09:11

@andyleary, можешь попробовать это и дай мне знать: =LET( _Conditions, MMULT(N(B2:C10 = "Y"),{1;1})>1, _Filter, FILTER(HSTACK(A2:A10,D2:O10),_Conditions,""), _Name, TAKE(_Filter,,1), _Uniq, UNIQUE(_Name), VSTACK(HSTACK(A1,D1:O1),HSTACK(_Uniq,MMULT(N(_Uniq=TOROW(_Na‌​me)),DROP(_Filter,,1‌​)))))

Mayukh Bhattacharya 10.07.2024 09:16

@andyleary, честно говоря, для больших наборов данных я лично использую Power Query и не полагаюсь на формулы.

Mayukh Bhattacharya 10.07.2024 09:17

@andyleary Сэр, я провел тест скорости со своей стороны с 55K строками данных, на моей стороне не происходит сбоя. Вы можете скачать Excel из здесь Кроме того, я использую игровой ПК и ноутбук, может быть разница в производительности, на самом деле результат был получен в течение секунды. как мгновение ока!

Mayukh Bhattacharya 10.07.2024 09:24

эта формула тоже работает, но опять же не для больших наборов данных. Раньше я уже предпринимал попытки использовать запрос мощности, но снова обнаружил проблемы со скоростью по сравнению с использованием формул в самом Excel. Возможно, мне стоит попробовать еще раз. Хей-хо. Это все хорошая кривая обучения

andy leary 10.07.2024 09:26

извините, в моем файле произошла ошибка, из-за которой возникли задержки. Теперь я могу подтвердить, что формулы работают для размера набора данных. Однако последние формулы не ссылаются на A13:A15, что им нужно было бы сделать, поскольку потенциально может быть имя «D», которое должно было бы возвращать ноль. Это возможно? Первая формула делает это, но, судя по всему, не для больших наборов данных: =MAKEARRAY(ROWS(A13:A15),COLUMNS(B12:M12),LAMBDA(r,c, SUM((INDEX(A13:A15,r) )=A2:A10)*(B2:B10 = "Y")*(C2:C10 = "Y")*(IND‌​EX(B12:M12,c)=D1:O1)‌​*D2:O10) ))

andy leary 10.07.2024 10:47

@andyleary последние формулы представляют собой одну единую формулу динамического массива, она вернет весь массив, поэтому нет необходимости записывать вручную, a, b, c, d и т. д. Кроме того, нажмите на here, я провел несколько тестов скорости, работает без проблем Если у вас есть Excel, я попробую провести тест скорости, просто удалив личную информацию.

Mayukh Bhattacharya 10.07.2024 10:48

@andyleary также лучше преобразовать исходные диапазоны в Structured References, то есть Tables это поможет формулам автоматически корректироваться при добавлении/удалении новых строк!

Mayukh Bhattacharya 10.07.2024 10:52

как мне отправить вам Excel?

andy leary 10.07.2024 11:07

@andyleary просто создайте ссылку на один диск, ссылку на диск Google, ссылку на Dropbox или любой облачный диск и опубликуйте в следующих комментариях.

Mayukh Bhattacharya 10.07.2024 11:08
1drv.ms/x/s!Apl0h-1TIjwvyRYOfSQ_RkHux2BU
andy leary 10.07.2024 11:31

Это работает?

andy leary 10.07.2024 11:31

Да, это так. я сообщу тебе, браво!

Mayukh Bhattacharya 10.07.2024 11:32

Какая польза от столбца D, нужно ли мне это тоже учитывать?

Mayukh Bhattacharya 10.07.2024 11:36

столбец d не нужен для формулы

andy leary 10.07.2024 11:39

Окей, понял. Дайте мне минутку, я обновляюсь.

Mayukh Bhattacharya 10.07.2024 11:40

@andyleary Привет, сэр, я обновил другую формулу, она будет немного быстрее. Я протестировал версию для настольного компьютера, только что применил ее в Интернете.

Mayukh Bhattacharya 10.07.2024 12:30

Это обновленная формула, сравнительно более быстрая, чем предыдущая. =LET( _Conditions, BYROW(Conditions,LAMBDA(α,AND(α = "Y"))), _Extract, FILTER(HSTACK(IDData,Vals),_Conditions,""), MAKEARRAY(ROWS(ID),COLUMNS(Headers),LAMBDA(r,c,SUM((INDEX(ID‌​,r)=INDEX(_Extract,,‌​1))*DROP(_Extract,,1‌​)))))

Mayukh Bhattacharya 10.07.2024 12:36

Давайте продолжим обсуждение в чате.

andy leary 10.07.2024 13:11

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