如何在Calc中使用SUMIFS对含多列子字符串的数值求和?
LibreOffice Calc 多子字符串求和与月份筛选方案
一、多子字符串匹配求和
针对D2:D4中多个子字符串(salad、soup、paella)的求和需求,有两种实用方法:
方法1:SUMPRODUCT组合公式
直接遍历所有匹配条件,一次性计算总和:
=SUMPRODUCT(B$2:B$9; --(MMULT(--ISNUMBER(SEARCH(D$2:D$4; A$2:A$9)); ROW(D$2:D$4)^0)>0))
SEARCH(D$2:D$4; A$2:A$9):检查A列每个单元格是否包含D列任意子字符串,返回匹配位置或错误值ISNUMBER():将结果转为布尔值(匹配为TRUE,不匹配为FALSE)MMULT(..., ROW(D$2:D$4)^0):合并每行的多个匹配结果,只要有一个匹配就返回大于0的数值--:把布尔值/数值转为1或0,最终和B列价格相乘后求和
方法2:SUM+SUMIFS数组公式
利用数组遍历D列每个子字符串,分别计算SUMIFS后汇总:
=SUM(SUMIFS(B$2:B$9; A$2:A$9; "*"&D$2:D$4&"*"))
输入完成后需按下 Ctrl+Shift+Enter 作为数组公式确认,Calc会自动遍历D2:D4的每个值,执行多次SUMIFS并累加结果。
二、结合EOMONTH与MONTHS的月份筛选
如果需要同时筛选日期月份,可将日期条件加入上述求和公式:
示例1:筛选当月数据求和
假设C列为菜品的销售日期,求和当月内包含指定子字符串的价格:
=SUMPRODUCT(B$2:B$9; --(MMULT(--ISNUMBER(SEARCH(D$2:D$4; A$2:A$9)); ROW(D$2:D$4)^0)>0); --(C$2:C$9>=EOMONTH(TODAY(); -1)+1); --(C$2:C$9<=EOMONTH(TODAY(); 0))))
EOMONTH(TODAY(); -1)+1:计算当月第一天EOMONTH(TODAY(); 0):计算当月最后一天- 最后两个
--(...)是日期范围的筛选条件,只有在当月内的记录才会被计入
示例2:筛选与指定日期相差N个月的数据
假设E1为基准日期,筛选与该日期相差不超过3个月的记录求和:
=SUMPRODUCT(B$2:B$9; --(MMULT(--ISNUMBER(SEARCH(D$2:D$4; A$2:A$9)); ROW(D$2:D$4)^0)>0); --(ABS(MONTHS(C$2:C$9; E1))<=3))
MONTHS(C$2:C$9; E1):计算C列日期与E1日期的月份差ABS():取绝对值,确保前后N个月都被包含<=3:可根据需求调整月份范围
内容的提问来源于stack exchange,提问作者Souf
相关产品推荐
相关产品推荐

