在Excel中根据多个条件计算平均值
我回来了我的新的Excel问题。 可以说我有这样的桌子。
| A | B ------------------------------------------ 1 | ENV | Value ------------------------------------------ 2 | ABC - 10/1/2014 1:38:32 PM | 4 3 | XYZ - 10/1/2014 1:38:32 PM | 6 4 | ABC - 9/1/2014 1:38:32 PM | 1 5 | XYZ - 10/1/2014 1:38:32 PM | 10 6 | ABC - 10/1/2014 1:38:32 PM | 7 7 | XYZ - 9/1/2014 1:38:32 PM | 1 8 | ABC - 9/1/2014 1:38:32 PM | 10 9 | ABC - 10/1/2014 1:38:32 PM | 7 10 | XYZ - 10/1/2014 1:38:32 PM | 7
现在,在Cell C2中,我select了ABC。
因此,在单元格D2中,我要求所有“ABC”( col A )(其中月份= 10( col A )和所有“ABC”中的单元格E2,Max( 来自col B ))的平均值月份= 10( 栏A )。
所以,我的结果D2和E2分别是6和7。
我希望我的问题和例子是有道理的。
更新:
谢谢大家的帮助。
现在让我们说,我不知道这个电子表格上有多less行,所以我想出了这个公式,但它不工作,给我#DIV / 0! 错误。
*注意:我正在使用公式从单元格C2中获取“ABC”和“10”。
=AVERAGEIFS( (OFFSET($A$1,1,1,COUNTA($B:$B)-1,1)), OFFSET($A$1,1,0,COUNTA($A:$A)-1,1), (MID(C2,1,(FIND("-",C2))-2)), OFFSET($A$1,1,0,COUNTA($A:$A)-1,1), (MID(C2,(FIND("-",C2)+1),(FIND("/",C2))-(FIND("-",C2)+1))))
甚至试过这个,但同样的错误:
=SUMPRODUCT(((MID(A2:A10,1,(FIND("-",A2:A10))-1))=(MID(C2,(FIND("-",C2)+1),(FIND("/",C2))-(FIND("-",C2)+1))))* (MONTH(DATEVALUE(MID(A2:A10,7,99)))=(MID(C2,(FIND("-",C2)+1),(FIND("/",C2))-(FIND("-",C2)+1))))* (B2:B10))/SUMPRODUCT(((MID(A2:A10,1,(FIND("-",A2:A10))-1))=(MID(C2,(FIND("-",C2)+1),(FIND("/",C2))-(FIND("-",C2)+1))))* (MONTH(DATEVALUE(MID(A2:A10,7,99)))=(MID(C2,(FIND("-",C2)+1),(FIND("/",C2))-(FIND("-",C2)+1)))))
你能帮助我吗?
具有中介价值的解决scheme
为了解决这个问题(我只testing了平均值 ),我首先使用了2个中间值:这个解决scheme不是最优的,将会有许多更聪明的方法来解决这个问题(例如数据透视表)。
ENV Value Intermediary 1 Intermediary 2 ABC - 10/1/2014 1:38:32 PM 4 ABC 10 XYZ - 10/1/2014 1:38:32 PM 6 XYZ 10 ABC - 9/1/2014 1:38:32 PM 1 ABC 9 XYZ - 10/1/2014 1:38:32 PM 10 XYZ 10
第一个中间列包含ENV列的前3个字符( =LEFT(A9,3)
),而第二个中间列包含月份( =MID(A9,7,2)
)。 这只适用于你的ENV
logging是固定大小和同质的(例如你的env名字恰好有3个字符)。
有了这个布局,你可以计算出平均放入任何单元格的公式:
=AVERAGEIFS(D9:D12, F9:F12,"=ABC", G9:G12, "=10")
其中D9:D12
为数值区间, F9:F12
为第一中间列, G9:G12
为第二中间列。
One Shot Compact解决scheme(arrays)
一个优化的解决scheme可以依靠arrays
find。 例如,要根据2个“vector”条件计算一个区间的平均值和最大值,可以写下这一行:
= MAX(IF((LEFT(A9:A12,3)="ABC")*(MID(A9:A12,7,2)="10"),D9:D12)) = AVERAGE(IF((LEFT(A9:A12,3)="ABC")*(MID(A9:A12,7,2)="10"),D9:D12))
用A9:A12
您的原始logging, D9:D12
是值间隔。
这个解决scheme的优点是你不需要任何中间列,并且你可以扩展这个方法到所有其他没有' xxxxxIFS
'的公式( MAX
是这种情况)。
注 :您必须使用CTRL + SHIFT + RETURN
确认此公式,否则您的公式将失败,并显示#VALUE
错误。
现场演示
现场演示可在这里 。
您可以通过使用 – Data> Text to Columns以分隔符“ – ”将列A吐在date和字母的首位。 (F和G)后,可以使用函数“AVERAGEIF”,条件是检查“F”中的单元格的值是ABC,而Moth(单元格中的“G”)= 10.对于最大值,对于E列可以使用MAX(IF ….)。
SUMPRODUCT
将允许您parsing组合string中最左侧和最后一个字符。 伪MAXIF()可以使用MAX()
和INDEX()
类似地构造。
在D2使用=SUMPRODUCT((LEFT(A2:A10,3)="ABC")*(MONTH(DATEVALUE(MID(A2:A10,7,99)))=10)*(B2:B10))/SUMPRODUCT((LEFT(A2:A10,3)="ABC")*(MONTH(DATEVALUE(MID(A2:A10,7,99)))=10))
在E2中使用=MAX(INDEX((LEFT(A2:A10,3)="ABC")*(MONTH(DATEVALUE(MID(A2:A10,7,99)))=10)*(B2:B10),,))
SUMPRODUCT
和INDEX
喜欢在parsing文本时窒息任何类似于错误的东西,因此请将单元格范围引用到您的实际数据,避免出现空白。
您的结果应该如下所示。