如何在 arrayformula 中添加带有 where 日期条件的查询?
How to add a query with where date condition in a arrayformula?
我需要在 arrayformula 中添加一个查询。
我的数据:
一个
B
C
D
E
F
1
日期
项目
交易
价格
数量
数组公式???
2
2021/06/30
aaaa
验证
14.00
1
74.00 ((5-0)*14+4)
3
2021/06/30
bbbb
验证
10.00
1
202.00 ((40-20)*10+2)
4
2021/06/30
bbbb
卖出
15.00
20
-
5
2021/06/10
aaaa
收到
4.00
1
-
6
2021/05/31
aaaa
验证
10.00
1
50.00 ((5-0)*10+0)
7
2021/05/31
bbbb
验证
8.00
1
322.00 ((40-0)*8+2)
8
2021/05/20
bbbb
收到
2.00
1
-
9
2021/05/10
bbbb
购买
8.00
40
-
10
2021/05/09
aaaa
购买
11.00
5
-
基本上我需要在 F 列中:如果交易是“验证”,return 该项目收到的价值加上库存数量之间的产品(列E,其中 C 列为“买入”减去 E 列,其中 C 列为“卖出”)和当前价格(D 列)直到该日期 .
我想我需要 3 个查询:一个用于接收值,另一个用于购买数量,最后一个用于销售数量。我卡在了第一个查询中:
=SUM(QUERY(A2:E;"SELECT SUM(D) WHERE A <= date '"&TEXT(DATEVALUE(A2);"yyyy-mm-dd")&"' AND C = 'received' AND B = '"&B2&"'"))
另一种方法:
=vlookup(B2;QUERY(A2:E;"SELECT B, SUM(D) WHERE A <= date '"&TEXT(DATEVALUE(A2);"yyyy-mm-dd") &"' AND C = 'received' AND B = '"&B2&"' 按 B 分组");2;false)+(vlookup(B2;QUERY(A2:E;"SELECT B, SUM (E) WHERE A <= date '"&TEXT(DATEVALUE(A2);"yyyy-mm-dd")&"' AND C = 'buy' AND B = '"&B2&"' group by B"); 2;false)-iferror(vlookup(B2;QUERY(A2:E;"SELECT B, SUM(E) WHERE A <= date '"&TEXT(DATEVALUE(A2);"yyyy-mm-dd" )&"' AND C = 'sell' AND B = '"&B2&"' 按 B 分组");2;false);0))*D2
我无法将其添加到数组公式(单元格 F1)中。顺便说一句,我需要一个数组公式,因为我有很多数据。
对不起我的英语。感谢您的帮助!
尝试:
={"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)))}
@Max Makhrov 发布的答案是这样的 using "MMULT(TRANSPOSE(" to FILTER in ARRAYFORMULA. I solved my question with the below arrayformula (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)))))}
我需要在 arrayformula 中添加一个查询。 我的数据:
一个 | B | C | D | E | F | |
---|---|---|---|---|---|---|
1 | 日期 | 项目 | 交易 | 价格 | 数量 | 数组公式??? |
2 | 2021/06/30 | aaaa | 验证 | 14.00 | 1 | 74.00 ((5-0)*14+4) |
3 | 2021/06/30 | bbbb | 验证 | 10.00 | 1 | 202.00 ((40-20)*10+2) |
4 | 2021/06/30 | bbbb | 卖出 | 15.00 | 20 | - |
5 | 2021/06/10 | aaaa | 收到 | 4.00 | 1 | - |
6 | 2021/05/31 | aaaa | 验证 | 10.00 | 1 | 50.00 ((5-0)*10+0) |
7 | 2021/05/31 | bbbb | 验证 | 8.00 | 1 | 322.00 ((40-0)*8+2) |
8 | 2021/05/20 | bbbb | 收到 | 2.00 | 1 | - |
9 | 2021/05/10 | bbbb | 购买 | 8.00 | 40 | - |
10 | 2021/05/09 | aaaa | 购买 | 11.00 | 5 | - |
基本上我需要在 F 列中:如果交易是“验证”,return 该项目收到的价值加上库存数量之间的产品(列E,其中 C 列为“买入”减去 E 列,其中 C 列为“卖出”)和当前价格(D 列)直到该日期 . 我想我需要 3 个查询:一个用于接收值,另一个用于购买数量,最后一个用于销售数量。我卡在了第一个查询中:
=SUM(QUERY(A2:E;"SELECT SUM(D) WHERE A <= date '"&TEXT(DATEVALUE(A2);"yyyy-mm-dd")&"' AND C = 'received' AND B = '"&B2&"'"))
另一种方法:
=vlookup(B2;QUERY(A2:E;"SELECT B, SUM(D) WHERE A <= date '"&TEXT(DATEVALUE(A2);"yyyy-mm-dd") &"' AND C = 'received' AND B = '"&B2&"' 按 B 分组");2;false)+(vlookup(B2;QUERY(A2:E;"SELECT B, SUM (E) WHERE A <= date '"&TEXT(DATEVALUE(A2);"yyyy-mm-dd")&"' AND C = 'buy' AND B = '"&B2&"' group by B"); 2;false)-iferror(vlookup(B2;QUERY(A2:E;"SELECT B, SUM(E) WHERE A <= date '"&TEXT(DATEVALUE(A2);"yyyy-mm-dd" )&"' AND C = 'sell' AND B = '"&B2&"' 按 B 分组");2;false);0))*D2
我无法将其添加到数组公式(单元格 F1)中。顺便说一句,我需要一个数组公式,因为我有很多数据。 对不起我的英语。感谢您的帮助!
尝试:
={"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)))}
@Max Makhrov 发布的答案是这样的
={"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)))))}