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:

  1. 问题中的查询、公式
  2. 总结
  3. 总和
  4. 总和(过滤器(...))
  5. 总和(如果(A*B, ... , 0))

看看file with example