【问题标题】:Google Spreasheet QUERY Function to Something I can use in ARRAYFORMULA我可以在 ARRAYFORMULA 中使用的 Google 电子表格查询函数
【发布时间】:2016-02-18 18:48:53
【问题描述】:

我有如下查询功能

=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

所需的列是:

CHECK
162.5
80.75
1345
656
2033
2762
1757

如果我输入每一行公式: =SUMIFS(C$2:C,A$2:A,"="&A2,B$2:B,"

提前致谢。

如果你想玩,只需复制给自己:https://docs.google.com/spreadsheets/d/12F4EsHvkiZb5gAPVo_uosd2YpZ1nw9QED_JlSAcVQYU/edit?usp=sharing

【问题讨论】:

  • 您已获得“Tumbleweed”徽章(提出了一个零分、没有答案、没有 cmets 且一周内浏览量低的问题)=)))
  • 难怪,我试图激励自己为你解决这个问题,但这真的很无聊。
  • 甚至可以不使用javascript和自定义函数吗? (谢谢你的诚实,现在我至少知道为什么没有cmets了
  • 可能。但是为了您和读者,您应该重新构建您的问题。简化它,使其更易于阅读。在此过程中,您也可能会找到解决方案。如果需要,请转到伪代码或使用图表。您需要清楚地了解流程,而不会迷失在细节中。
  • 我已经简化了一个例子,甚至提供了谷歌电子表格的测试区域。简单的不知道如何让它变得更容易。

标签: google-sheets array-formulas


【解决方案1】:

答案如下:

=MMULT(TRANSPOSE(ArrayFormula(--($A$2:$A$8=TRANSPOSE(A2:A8))*--($B$2:$B$8<=TRANSPOSE(B2:B8)))),C2:C8)

这个公式可以转换成更通用的公式,动态计算范围,即OFFSET(A2,,,COUNTA(A2:A))

说明

我们使用mmult 函数,它本身就是一个数组函数。这是Help Center info about mmult。所以我们必须准备两个矩阵。第一个带有条件的矩阵,第二个带有我们已经拥有的数字。尝试输入此部分或公式以获取具有条件的矩阵:

=ArrayFormula(--($A$2:$A$8=TRANSPOSE(A2:A8))*--($B$2:$B$8<=TRANSPOSE(B2:B8)))

在这一部分中,我们得到了带有 Zoros 和 Ones 的表/矩阵。我更喜欢使用 '--' 将 Boolaen 转换为 Integer:related question

其中的转置必须用于使公式展开。这是主要技巧。 Arrayformula 不能用于比较两个垂直数组。所以你必须转置其中之一。 在您的问题中,我们有两个带有 AND 逻辑的条件:A * B。所以我们将两个条件相乘。但我认为,可以添加超过 2 个条件。 如果你喜欢做 OR 条件,你需要添加它们 A + B。一些例子:

  • (A + B) * C -- [A 或 B] AND C
  • A + B * C -- A OR [B 和 C]

结论

这对我来说是一个真正的挑战。顺便说一句,我找到了 5 个不同的公式来计算,但无法将它们转换为 ArrayFormula:

  1. 查询,您问题中的公式
  2. 总结
  3. sumproduct
  4. 总和(过滤器(...))
  5. sum(if(A*B, ... , 0))

file with example

【讨论】:

  • 太棒了!我尝试了许多公式,但没有成功在 ArrayFormula 中使用它们。请在公式之前解释一下。
  • 谢谢,我已经添加了一些解释,如果有帮助请告诉我。
  • 谢谢,我了解矩阵部分,只是对公式中的“--”感到好奇--($A$2:$A$8=TRANSPOSE(A2:A8))
猜你喜欢
  • 2015-11-29
  • 1970-01-01
  • 2021-10-15
  • 1970-01-01
  • 1970-01-01
  • 2018-10-17
  • 1970-01-01
  • 2020-10-11
  • 1970-01-01
相关资源
最近更新 更多