Google 我可以在 ARRAYFORMULA 中使用的电子表格查询函数
Google Spreasheet QUERY Function to Something I can use in ARRAYFORMULA
我有如下查询功能
=QUERY(C:J,"SELECT SUM(J) WHERE C='"&C2&"' AND H<=date'"&TEXT(H2,"yyyy-MM-dd")&"' LABEL SUM(J) ''",0)
WHERE C2 和 H2 相对且在每一行上都是唯一的(C2、C3、C4...和 H2、H3、H4...)
我需要将它放入 ARRAYFORMULA 中,因此它会在每一行上产生一些结果
我已经花了将近一整天的时间,使用 SUMIFS 检查所有其他解决方案并尝试使用 MMULT 重写公式,但没有任何成功。
这里是简化的例子:
Proj Date Hours
APROJ 6/29/2015 81.75
APROJ 6/22/2015 80.75
BPROJ 8/3/2015 689
BPROJ 8/2/2015 656
BPROJ 8/10/2015 688
BPROJ 8/11/2015 729
CPROJ 8/12/2015 1757
我的尝试没有成功:=arrayformula(mmult((A:A=A1:A)*(B:B<=B1:B)*N(C:C),transpose(sign(column(C :C)))))
所需的列是:
CHECK
162.5
80.75
1345
656
2033
2762
1757
如果我在每一行中输入公式:=SUMIFS(C$2:C,A$2:A,"="&A2,B$2:B,"<="&B2) 它在手动展开开始时有效从第 2
提前致谢。
想玩就复制给自己:https://docs.google.com/spreadsheets/d/12F4EsHvkiZb5gAPVo_uosd2YpZ1nw9QED_JlSAcVQYU/edit?usp=sharing
答案如下:
=MMULT(TRANSPOSE(ArrayFormula(--($A:$A=TRANSPOSE(A2:A8))*--($B:$B<=TRANSPOSE(B2:B8)))),C2:C8)
这个公式可以转换成更通用的公式,动态计算范围,即OFFSET(A2,,,COUNTA(A2:A))
。
说明
我们使用mmult
函数,它本身就是一个数组函数。这里是 Help Center info about mmult。所以我们要准备两个矩阵。第一个带有条件的矩阵,第二个带有我们已经拥有的数字。尝试输入此部分或公式以获取条件矩阵:
=ArrayFormula(--($A:$A=TRANSPOSE(A2:A8))*--($B:$B<=TRANSPOSE(B2:B8)))
在这部分我们得到 table / 矩阵与 Zoros 和 Ones。我更喜欢使用 '--' 将布尔值转换为整数:related question
必须使用里面的Transpose才能使公式展开。这是主要技巧。 Arrayformula 不能用于比较两个垂直数组。所以你必须转置其中之一。
在您的问题中,我们有两个具有 AND 逻辑的条件:A * B。因此我们将条件的两部分相乘。但我认为,可以添加 2 个以上的条件。
如果你想做 OR 条件,你需要添加它们 A + B。一些例子:
- (A + B) * C -- [A 或 B] 和 C
- A + B * C -- A 或 [B 和 C]
结论
这对我来说是一个真正的挑战。顺便说一下,我找到了 5 个不同的公式来计算这个,但无法将它们转换成 ArrayFormula:
- 问题中的查询、公式
- 总结
- 总和
- 总和(过滤器(...))
- 总和(如果(A*B, ... , 0))
我有如下查询功能
=QUERY(C:J,"SELECT SUM(J) WHERE C='"&C2&"' AND H<=date'"&TEXT(H2,"yyyy-MM-dd")&"' LABEL SUM(J) ''",0)
WHERE C2 和 H2 相对且在每一行上都是唯一的(C2、C3、C4...和 H2、H3、H4...)
我需要将它放入 ARRAYFORMULA 中,因此它会在每一行上产生一些结果
我已经花了将近一整天的时间,使用 SUMIFS 检查所有其他解决方案并尝试使用 MMULT 重写公式,但没有任何成功。
这里是简化的例子:
Proj Date Hours
APROJ 6/29/2015 81.75
APROJ 6/22/2015 80.75
BPROJ 8/3/2015 689
BPROJ 8/2/2015 656
BPROJ 8/10/2015 688
BPROJ 8/11/2015 729
CPROJ 8/12/2015 1757
我的尝试没有成功:=arrayformula(mmult((A:A=A1:A)*(B:B<=B1:B)*N(C:C),transpose(sign(column(C :C)))))
所需的列是:
CHECK
162.5
80.75
1345
656
2033
2762
1757
如果我在每一行中输入公式:=SUMIFS(C$2:C,A$2:A,"="&A2,B$2:B,"<="&B2) 它在手动展开开始时有效从第 2
提前致谢。
想玩就复制给自己:https://docs.google.com/spreadsheets/d/12F4EsHvkiZb5gAPVo_uosd2YpZ1nw9QED_JlSAcVQYU/edit?usp=sharing
答案如下:
=MMULT(TRANSPOSE(ArrayFormula(--($A:$A=TRANSPOSE(A2:A8))*--($B:$B<=TRANSPOSE(B2:B8)))),C2:C8)
这个公式可以转换成更通用的公式,动态计算范围,即OFFSET(A2,,,COUNTA(A2:A))
。
说明
我们使用mmult
函数,它本身就是一个数组函数。这里是 Help Center info about mmult。所以我们要准备两个矩阵。第一个带有条件的矩阵,第二个带有我们已经拥有的数字。尝试输入此部分或公式以获取条件矩阵:
=ArrayFormula(--($A:$A=TRANSPOSE(A2:A8))*--($B:$B<=TRANSPOSE(B2:B8)))
在这部分我们得到 table / 矩阵与 Zoros 和 Ones。我更喜欢使用 '--' 将布尔值转换为整数:related question
必须使用里面的Transpose才能使公式展开。这是主要技巧。 Arrayformula 不能用于比较两个垂直数组。所以你必须转置其中之一。 在您的问题中,我们有两个具有 AND 逻辑的条件:A * B。因此我们将条件的两部分相乘。但我认为,可以添加 2 个以上的条件。 如果你想做 OR 条件,你需要添加它们 A + B。一些例子:
- (A + B) * C -- [A 或 B] 和 C
- A + B * C -- A 或 [B 和 C]
结论
这对我来说是一个真正的挑战。顺便说一下,我找到了 5 个不同的公式来计算这个,但无法将它们转换成 ArrayFormula:
- 问题中的查询、公式
- 总结
- 总和
- 总和(过滤器(...))
- 总和(如果(A*B, ... , 0))