У меня есть IMPORTRANGE(...), который дает следующую таблицу:
Я хотел бы обернуть эту функцию чем-то вроде QUERY() с помощью GROUPBY или PIVOT() или какой-либо комбинации TRANSPOSE() и SUM(), чтобы получить следующий результат:
Обратите внимание, что для Rob's Birds нет строки, поскольку все эти значения равны нулю.
По сути, мне нужно взять все уникальные комбинации даты усыновления, даты возвращения домой, имени и (поворотных) видов животных и агрегировать сумму взрослых особей и сумму молодняка. Я уверен, что это возможно с помощью одной формулы, но не могу уяснить себе группировку, агрегирование и поворот как функцию оператора SQL-запроса. Спасибо за любую помощь.
@player0 Я могу настроить поиск, но молодое животное всегда будет следовать за взрослым животным, поэтому я мог бы использовать собак, кошек, кур вместо собак, кошек, птиц.





пытаться:
= {A1:C1, "Animal", "# Adults", "# Young";
QUERY(QUERY(INDEX(LET(b, D2:INDEX(I:I, MAX(ROW(A:A)*(A:A<>""))), a, OFFSET(b,,-3,,3), w, R:S,
c, TOCOL(FILTER(b, MOD(COLUMN(b)-1, 2)),,1),
d, TOCOL(FILTER(b, MOD(COLUMN(b), 2)),,1),
e, IFNA(VLOOKUP(TOCOL(FILTER(IF(b = "",,OFFSET(b,-1,,1,)), MOD(COLUMN(b)-1, 2)),,1), w, 2, )),
f, LAMBDA(x, REDUCE(x, SEQUENCE((COLUMNS(b)/2)-1), LAMBDA(a, b, IF(b, {a; x}))))(a), {f, e, c, d})),
"select Col1,Col2,Col3,Col4,sum(Col5),sum(Col6) group by Col1,Col2,Col3,Col4", ),
"where Col5>0 or Col6>0", )}
I:I, чтобы отразить последний столбецR:S, чтобы отразить вашу таблицу поискаSheet18!D2:I5:это зависит от того, где именно находится этот столбец с фамилией. например, если это здесь:
формула изменится следующим образом:
= {"Adoption Date", "Take-Home Date", "Name", "LAST NAME", "Animal", "# Adults", "# Young";
QUERY(QUERY(INDEX(LET(b, IMPORTRANGE("1sPiWXvVIIuNdUEl04Ku8zZs0zL3HYnTFXwV2C67Ex5k", "Sheet18!E2:J5"), a, OFFSET(b,,-4,,4), w, R:S,
c, TOCOL(FILTER(b, MOD(COLUMN(b), 2)),,1),
d, TOCOL(FILTER(b, MOD(COLUMN(b)-1, 2)),,1),
e, IFNA(VLOOKUP(TOCOL(FILTER(IF(b = "",,OFFSET(b,-1,,1,)), MOD(COLUMN(b), 2)),,1), w, 2, )),
f, LAMBDA(x, REDUCE(x, SEQUENCE((COLUMNS(b)/2)-1), LAMBDA(a, b, IF(b, {a; x}))))(a), {f, e, c, d})),
"select Col1,Col2,Col3,Col4,Col5,sum(Col6),sum(Col7) group by Col1,Col2,Col3,Col4,Col5", ),
"where Col6>0 or Col7>0", )}
Это работает именно так, как я просил. Оказывается, мне нужно включить столбец с фамилией, и я пытался адаптировать вашу формулу, но столкнулся с некоторыми проблемами. Есть минутка, чтобы дать подсказку?
Вот один из подходов, который вы можете опробовать:
=let(Σ,A2:D, Λ,lambda(x,wrapcols(x,rows(Σ),x)),
query(vstack({Σ,Λ("Canine"),E2:F},
{Σ,Λ("Feline"),G2:H},
{Σ,Λ("Bird"), I2:J}),
"select Col1,Col2,Col3,Col4,Col5,sum(Col6),sum(Col7) where Col6>0 OR Col7>0 group by Col1,Col2,Col3,Col4,Col5 label sum(Col6) '',sum(Col7) ''"))
Σ) будет A2:L && внутри vstack, вам нужно добавить дополнительное условие как таковое {Σ,Λ("Equine"),K2:L}Last Name добавлен сюда как Column_D для представления.Эта версия формулы встраивает и обрабатывает ваши данные напрямую.
=let(Σ,importrange("Sheet_ID","data!A2:J"), Γ,choosecols(Σ,1,2,3,4), Λ,lambda(x,wrapcols(x,rows(Σ),x)),
query(vstack({Γ,Λ("Canine"),choosecols(Σ,5,6)},
{Γ,Λ("Feline"),choosecols(Σ,7,8)},
{Γ,Λ("Bird"), choosecols(Σ,9,10)}),
"select Col1,Col2,Col3,Col4,Col5,sum(Col6),sum(Col7) where Col6>0 OR Col7>0 group by Col1,Col2,Col3,Col4,Col5 label sum(Col6) '',sum(Col7) ''"))
@player0 11 видов и категория «другое».