将 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
。请记住日期存储为整数。
criterium
:3&H2:H13
以数字为前缀的参考日期3
。
sum_range
:我们要根据范围和条件匹配求和的范围A2:A
,因此只有3
值为[=19=的行] 将被考虑。
如果过滤器具有值 ALL
,则结果如下:
不使用ALL
token时的解决方法:
注意: 与@player0 解决方案的预期结果的唯一区别是returns 0
当没有匹配时。
这是一个与 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
。请记住日期存储为整数。criterium
:3&H2:H13
以数字为前缀的参考日期3
。sum_range
:我们要根据范围和条件匹配求和的范围A2:A
,因此只有3
值为[=19=的行] 将被考虑。
如果过滤器具有值 ALL
,则结果如下:
不使用ALL
token时的解决方法:
注意: 与@player0 解决方案的预期结果的唯一区别是returns 0
当没有匹配时。