【问题标题】:How to add a query with where date condition in a arrayformula?如何在数组公式中添加带有 where 日期条件的查询?
【发布时间】:2021-09-19 04:37:42
【问题描述】:

我需要在 arrayformula 中添加一个查询。 我的数据:

A B C D E F
1 DATE ITEM TRANSACTION PRICE QTY ARRAYFORMULA???
2 2021/06/30 aaaa verify 14.00 1 74.00 ((5-0)*14+4)
3 2021/06/30 bbbb verify 10.00 1 202.00 ((40-20)*10+2)
4 2021/06/30 bbbb sell 15.00 20 -
5 2021/06/10 aaaa received 4.00 1 -
6 2021/05/31 aaaa verify 10.00 1 50.00 ((5-0)*10+0)
7 2021/05/31 bbbb verify 8.00 1 322.00 ((40-0)*8+2)
8 2021/05/20 bbbb received 2.00 1 -
9 2021/05/10 bbbb buy 8.00 40 -
10 2021/05/09 aaaa buy 11.00 5 -

基本上我需要在 F 列:如果交易是“验证”,返回该项目收到的价值加上库存数量之间的产品(E 列,其中 C 列是“购买”减去E 列,其中 C 列是“卖出”)和当前价格(D 列)直到该日期。 我想我需要 3 个查询:一个用于接收值,另一个用于购买数量,最后一个用于销售数量。我被困在第一个查询中:

=SUM(QUERY(A2:E;"SELECT SUM(D) WHERE A

另一种方法:

=vlookup(B2;QUERY(A2:E;"SELECT B, SUM(D) WHERE A

我无法在数组公式(单元格 F1)中添加它。顺便说一句,我需要一个数组公式,因为我有很多数据。 对不起我的英语。感谢您的帮助!

【问题讨论】:

  • 你在 A2 中有什么日期?
  • ArrayFormula 不能用于执行多个查询,因为每个单个查询已经返回一个数组,而不是单个值。您需要 1. 使用 AutoFill 填写每一行,或 2. 重组您的公式以执行与查询相同的操作,但不使用 QUERY。参考:webapps.stackexchange.com/questions/97310/…
  • @CarlosM 我以前见过这个,但我需要过滤日期。我不知道如何使用 vlookup(...&...&...) 过滤值。

标签: date google-sheets array-formulas


【解决方案1】:

尝试:

={"ARRAYFORMULA"; ARRAYFORMULA(IFNA((VLOOKUP(COUNTIFS(C2:C, C2:C, C2:C, "verify", ROW(C2:C), "<="&ROW(C2:C))&"♦"&B2:B&"♦buy", QUERY(SPLIT(FLATTEN(IFERROR(SEQUENCE(COUNTIF(C:C, "verify"))&"♦"&VLOOKUP(
IF(SEQUENCE(COUNTIF(C:C, "verify"), COUNTA(C:C))-(SEQUENCE(COUNTIF(C:C, "verify"), 1, 0)*COUNTA(C:C))>FILTER(ROW(A:A), C:C="verify"), SEQUENCE(1, COUNTA(C:C)), )&FILTER(B:B, C:C="verify"), 
{ROW(A:A)&B:B, B:B&"♦"&C:C&"×"&D:D&"×"&E:E}, 2, 0))), "×"), "select Col1,sum(Col2),sum(Col3) where Col2 is not null group by Col1"), 3, 0)-
 IFNA(VLOOKUP(COUNTIFS(C2:C, C2:C, C2:C, "verify", ROW(C2:C), "<="&ROW(C2:C))&"♦"&B2:B&"♦sell", QUERY(SPLIT(FLATTEN(IFERROR(SEQUENCE(COUNTIF(C:C, "verify"))&"♦"&VLOOKUP(
IF(SEQUENCE(COUNTIF(C:C, "verify"), COUNTA(C:C))-(SEQUENCE(COUNTIF(C:C, "verify"), 1, 0)*COUNTA(C:C))>FILTER(ROW(A:A), C:C="verify"), SEQUENCE(1, COUNTA(C:C)), )&FILTER(B:B, C:C="verify"), 
{ROW(A:A)&B:B, B:B&"♦"&C:C&"×"&D:D&"×"&E:E}, 2, 0))), "×"), "select Col1,sum(Col2),sum(Col3) where Col2 is not null group by Col1"), 3, 0), 0))*
 IF(C2:C="verify", D2:D, )+
 IFNA(VLOOKUP(COUNTIFS(C2:C, C2:C, C2:C, "verify", ROW(C2:C), "<="&ROW(C2:C))&"♦"&B2:B&"♦received", QUERY(SPLIT(FLATTEN(IFERROR(SEQUENCE(COUNTIF(C:C, "verify"))&"♦"&VLOOKUP(
IF(SEQUENCE(COUNTIF(C:C, "verify"), COUNTA(C:C))-(SEQUENCE(COUNTIF(C:C, "verify"), 1, 0)*COUNTA(C:C))>FILTER(ROW(A:A), C:C="verify"), SEQUENCE(1, COUNTA(C:C)), )&FILTER(B:B, C:C="verify"), 
{ROW(A:A)&B:B, B:B&"♦"&C:C&"×"&D:D&"×"&E:E}, 2, 0))), "×"), "select Col1,sum(Col2),sum(Col3) where Col2 is not null group by Col1"), 2, 0), 0)))}


非英语语言环境:

={"ARRAYFORMULA"; ARRAYFORMULA(IFNA((VLOOKUP(COUNTIFS(C2:C; C2:C; C2:C; "verify"; ROW(C2:C); "<="&ROW(C2:C))&"♦"&B2:B&"♦buy"; QUERY(SPLIT(FLATTEN(IFERROR(SEQUENCE(COUNTIF(C:C; "verify"))&"♦"&VLOOKUP(
IF(SEQUENCE(COUNTIF(C:C; "verify"); COUNTA(C:C))-(SEQUENCE(COUNTIF(C:C; "verify"); 1; 0)*COUNTA(C:C))>FILTER(ROW(A:A); C:C="verify"); SEQUENCE(1; COUNTA(C:C)); )&FILTER(B:B; C:C="verify"); 
{ROW(A:A)&B:B\ B:B&"♦"&C:C&"×"&D:D&"×"&E:E}; 2; 0))); "×"); "select Col1,sum(Col2),sum(Col3) where Col2 is not null group by Col1"); 3; 0)-
 IFNA(VLOOKUP(COUNTIFS(C2:C; C2:C; C2:C; "verify"; ROW(C2:C); "<="&ROW(C2:C))&"♦"&B2:B&"♦sell"; QUERY(SPLIT(FLATTEN(IFERROR(SEQUENCE(COUNTIF(C:C; "verify"))&"♦"&VLOOKUP(
IF(SEQUENCE(COUNTIF(C:C; "verify"); COUNTA(C:C))-(SEQUENCE(COUNTIF(C:C; "verify"); 1; 0)*COUNTA(C:C))>FILTER(ROW(A:A); C:C="verify"); SEQUENCE(1; COUNTA(C:C)); )&FILTER(B:B; C:C="verify"); 
{ROW(A:A)&B:B\ B:B&"♦"&C:C&"×"&D:D&"×"&E:E}; 2; 0))); "×"); "select Col1,sum(Col2),sum(Col3) where Col2 is not null group by Col1"); 3; 0); 0))*
 IF(C2:C="verify"; D2:D; )+
 IFNA(VLOOKUP(COUNTIFS(C2:C; C2:C; C2:C; "verify"; ROW(C2:C); "<="&ROW(C2:C))&"♦"&B2:B&"♦received"; QUERY(SPLIT(FLATTEN(IFERROR(SEQUENCE(COUNTIF(C:C; "verify"))&"♦"&VLOOKUP(
IF(SEQUENCE(COUNTIF(C:C; "verify"); COUNTA(C:C))-(SEQUENCE(COUNTIF(C:C; "verify"); 1; 0)*COUNTA(C:C))>FILTER(ROW(A:A); C:C="verify"); SEQUENCE(1; COUNTA(C:C)); )&FILTER(B:B; C:C="verify"); 
{ROW(A:A)&B:B\ B:B&"♦"&C:C&"×"&D:D&"×"&E:E}; 2; 0))); "×"); "select Col1,sum(Col2),sum(Col3) where Col2 is not null group by Col1"); 2; 0); 0)))}

【讨论】:

  • 我不知道为什么,但它不起作用。我用“;”替换了所有“,” (查询除外)因为我的语言。 link
  • 几乎...我注意到,该公式不包含除“验证”以外的交易行,而另一行则包含“验证”交易(两者都具有相同的日期)。 link 在这种情况下,我期望 402 而不是 322。那天,我以 7 美元的价格又买了 10 个单位的“bbbb”,但“真实”价值是 8 美元。为了解决这个问题,我需要手动更改行...谢谢您的帮助!
【解决方案2】:

@Max Makhrov 发布了一个答案是 link,在 ARRAYFORMULA 中使用“MMULT(TRANSPOSE(”到 FILTER)。我用下面的数组公式 (link) 解决了我的问题:

={"ARRAYFORMULA";ARRAYFORMULA(IF(C2:C<>"verify";"";MMULT(--(TRANSPOSE(A2:A)<=A2:A)*(TRANSPOSE(B2:B)=B2:B)*(TRANSPOSE(C2:C)="received");if(D2:D="";0;D2:D))+if(D2:D="";0;D2:D)*(MMULT(--(TRANSPOSE(A2:A)<=A2:A)*(TRANSPOSE(B2:B)=B2:B)*(TRANSPOSE(C2:C)="buy");if(E2:E="";0;E2:E))-MMULT(--(TRANSPOSE(A2:A)<=A2:A)*(TRANSPOSE(B2:B)=B2:B)*(TRANSPOSE(C2:C)="sell");if(E2:E="";0;E2:E)))))}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-07-25
    • 1970-01-01
    • 2021-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-25
    • 1970-01-01
    相关资源
    最近更新 更多