将 ARRAYFORMULA 与 SUMIF 一起用于多个条件以及使用通配符的条件。按月计算的结果

Using ARRAYFORMULA with SUMIF for multiple conditions combined with conditions using a wildcard. Result by Months

这是一个与 类似的问题,但试图通过给定年份 的所有月份获得第一列的总和 。我试图推断@player0 提供的相同解决方案,但 group by 不起作用,因为我想获得一年中每个月的结果,而不管源上的月份数据如何。这是示例:

G 列中,我们有不同的过滤条件,它可以包含一个特殊标记:ALL 以包含每个条件的所有值。对于年份,我们可以 select 给定的年份,我们希望按一年中的每个月对结果求和。

I使用与参考问题类似的想法具有预期结果,但无法用ArrayFormula表示(查询结果未展开):

=IFNA(QUERY(QUERY(FILTER($A:$E, 
 IF($G="All", $B:$B<>"×", $B:$B=$G), 
 IF($G="All", $C:$C<>"×", $C:$C=$G), 
 IF($G="All", $D:$D<>"×", $D:$D=$G),
 YEAR($E:$E) = $G
 ), 
 "select sum(Col1) where month(Col5) =" & MONTH($H2) - 1), 
  "offset 1", 0),"")

在列 J 上,数组尝试不起作用,因为我们不能将虚拟范围与 SUMIF 一起使用,这可以通过使用 FILTER 创建辅助列来解决,但我我正在寻找不需要那个的解决方案。

=Arrayformula(if(not(ISBLANK(H2:H)), sumif(
Filter(FILTER($A:$E, IF($G="All", $B:$B<>"×",
 $B:$B=$G), IF($G="All", $C:$C<>"×", $C:$C=$G), 
 IF($G="All", $D:$D<>"×", $D:$D=$G), 
 YEAR($E:$E) = $G),{1,0,0,0,0}), H2:H,
Filter(FILTER($A:$E, IF($G="All", $B:$B<>"×", 
 $B:$B=$G), IF($G="All", $C:$C<>"×", $C:$C=$G), 
 IF($G="All", $D:$D<>"×", $D:$D=$G), 
  YEAR($E:$E) = $G), {0,0,0,0,1})
),))

这是示例电子表格: https://docs.google.com/spreadsheets/d/1Lqjim3c_j8KNr_7LVlKjlR4BXi9_1HFoGDuwsuX1XS0/edit?usp=sharing

尝试:

=INDEX(IFNA(VLOOKUP(MONTH(H2:H13), QUERY(QUERY(FILTER(A2:E, 
 IF(G3="All", B2:B<>"×", B2:B=G3), 
 IF(G5="All", C2:C<>"×", C2:C=G5), 
 IF(G7="All", D2:D<>"×", D2:D=G7)), 
 "select month(Col5)+1,sum(Col1) 
  where Col1 is not null "&IF(G9="",," 
    and year(Col5)="&G9)&  
 "group by month(Col5)+1"), 
  "offset 1", 0), 2, 0)))

此公式位于样本 Sheet1 的单元格 L2 中。它是一个 sumif(),它使用正则表达式和 MMULT 创建满足条件的 3' 的数组,并将其与 'sumif' 条件的月份一起使用。

=ARRAYFORMULA(SUMIF(MMULT(N(REGEXMATCH(B2:D,SUBSTITUTE({G3,G5,G7},"ALL",))),
 {1;1;1})&EOMONTH(E2:E,-1)+1,3&H2:H13,A2:A))

详细说明 (公式,然后在下面几行解释)

SUBSTITUTE({G3,G5,G7},"ALL",)

生成一个 1x3 数组,其中包含 G3,G5,G7 个值,如果 "ALL" 则将被替换为空字符串。如果是 ("ALL", ALL", "ALL") returns: (,,)SUBSTITUTE 的结果将是要在 REGEXMATCH 中使用的正则表达式. 在 ("ALL", ALL", "ALL") REGEXMATCH 的情况下,每行将 return (TRUE, TRUE, TRUE)

REGEXMATCH(B2:D,SUBSTITUTE({G3,G5,G7},"ALL",))

Return 与 B2:D 大小相同的数组(比方说 Mx3 数组)满足条件 (TRUE|FALSE)值和函数 N() 将其转换为 (0|1) 个值。

MMULT(N(REGEXMATCH(B2:D,SUBSTITUTE({G3,G5,G7},"ALL",))),
 {1;1;1})

将两个矩阵相乘:Mx3 x 3x1 和 return 数组 Mx1。如果满足所有筛选条件,将 return 给定单元格上的数字 3 (我们有三个条件),否则数字低于 3.

EOMONTH(E2:E,-1)+1

计算单元格 E2:E 上个月的最后一天,再加上 E2:E 月份的第一天。我们需要将这些日期与 H2:H 中表示该月第一天的日期进行比较。

SUMIF(range, criterion, [sum_range])
  • range:将包含具有以下值之一的 Mx1 的数组:{0,1,2,3} 取决于满足的条件数。它附加 &EOMONTH(E2:E,-1)+1。请记住日期存储为整数。

  • criterium3&H2:H13以数字为前缀的参考日期3

  • sum_range:我们要根据范围和条件匹配求和的范围A2:A,因此只有3值为[=19=的行] 将被考虑。

如果过滤器具有值 ALL,则结果如下:

不使用ALLtoken时的解决方法:

注意: 与@player0 解决方案的预期结果的唯一区别是returns 0当没有匹配时。