一、问题提出
现在有多行数据,领导要求给出下图(截取了公司部分部门的一季度工资)绿色方框内的公式,计算一下一季度各部门月度工资合计。
二、分析思路
要分别将各部门“1月”和“1月”的工资、“2月”和“2月”、“3月”和“3月”的工资相加,一共是3个月
(1)表格观察:
“1月”所在行的序号是1、4、7..13,这些序号的间隔是3;
“2月”所在行的序号是2、5、8..14,这些序号的间隔是3;
“3月”同样也是这个规律。由此我们就可利用mod除固定间隔3来求余数
我们还需要mod的第一个参数,即用什么来除以3呢?
(2)序号是什么?
它扣掉1,就是表格A5:M20的数据区D6:M20各行行号逐行减去第一行(第6行)行号6,例如第15行的序号10-1=15-6
由于数据区相同月份出现的间隔是相同的,都是3,因此用扣1的序号(即行号的差值)除以3看看结果:D21=mod(row(D6:D20)-row(D$6),3)
它将会得到数组{0,1,2,0,1,2...}
至此,由“行号→序号→数组”这个链条是搭好了。
(3)数组的规律
数组中只有0、1和2 三类元素,分别对应着“1月”、“2月”和“3月”。我们可以将数据区进行过滤,条件就设定为序号分别等于0、1和2。为了让公式在向下拉时,自动可变,这三个数用Row转换一下就是row(D1)、row(D2)和row(D3)。
如果表格中有“序号”列,直接在公式中引用;如果没有,就用行号差来计算。
过滤函数filter可以拿出来使唤了——针对“1月”的公式D21=filter(D6:D20,mod(row(D6:D20)-row(D6),3)=row(D1)-1
由于D21公式是在D列,因此filter过滤的列标写成D,实际上换成其他列标也可,但为了一致性,眼睛看得舒服,建议写D,对同一列过滤就行。
至此,由“行号→序号→数组→过滤”这个链条是搭好了。
(4)汇总等统计
在上面的公式中套上SUM函数就完成了。
三、问题解决
消化了上面的分析,结果的给出自然是水到渠成了..
为了防止在拖拉公式时,指定的区域的行号、列标按需变化,将有关要素进行$锁定,公式如下:
D21=SUM(FILTER(D$6:D$20,MOD(ROW(D$6:D$20)-ROW($A$6),3)=ROW(D1)-1))
将这个公式,向下、向右拖拉就可以了。
四、问题回顾
(1)回顾
“行号→序号→数组→过滤→汇总”
隔行统计不算复杂,也不只是这一种方法可以得到答案,但是本例子的解决方案是从固定间隔入手,联想到mode,从{0,1,2}余数有限且间隔相同,联想到filter,对某一列施加过滤条件,最后汇总统计。
(2)拓展
本例是月度间隔固定为3,但公式并不只限于间隔为3的情况,任何固定的间隔1,2,3...均可使用,将公式中的3修改为n即可。
,