Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
优化Excel公式-SUMPRODUCT与SUMIFS/COUNTIFS_Excel_Excel Formula_Excel 2010_Formula - Fatal编程技术网

优化Excel公式-SUMPRODUCT与SUMIFS/COUNTIFS

优化Excel公式-SUMPRODUCT与SUMIFS/COUNTIFS,excel,excel-formula,excel-2010,formula,Excel,Excel Formula,Excel 2010,Formula,根据一些网站的数据,SUMIFS和COUNTIFS比SUMPRODUCT更快(例如:)。我有一个未知行数(大约200000行)的工作表,我正在用这些行数计算性能报告。我有6000多次几乎相同的SUMPRODUCT公式,每次都有几次不同(只是条件不同) 下面是我得到的一个例子: =IF(AFO4>0, (SUMPRODUCT((Sheet1!$N:$N=$A4) *(LEFT(Sheet1!$H:$H,2)="1A") *(Sheet1!$M:$M<>"service catal

根据一些网站的数据,SUMIFS和COUNTIFS比SUMPRODUCT更快(例如:)。我有一个未知行数(大约200000行)的工作表,我正在用这些行数计算性能报告。我有6000多次几乎相同的SUMPRODUCT公式,每次都有几次不同(只是条件不同)

下面是我得到的一个例子:

=IF(AFO4>0,
(SUMPRODUCT((Sheet1!$N:$N=$A4)
*(LEFT(Sheet1!$H:$H,2)="1A")
*(Sheet1!$M:$M<>"service catalog")
*(Sheet1!$J:$J="incident")
*(Sheet1!$I:$I<>"self-serve")
*(Sheet1!$AK:$AK=AFM$1)
*(Sheet1!$E:$E>=$E$1)
*(Sheet1!$E:$E<$E$2))
+SUMPRODUCT((Sheet1!$AJ:$AJ=$C4)
*(LEFT(Sheet1!$H:$H,2)="1A")
*(Sheet1!$M:$M<>"service catalog")
*(Sheet1!$J:$J="incident")
*(Sheet1!$I:$I="self-serve")
*(Sheet1!$AK:$AK=AFM$1)
*(Sheet1!$E:$E>=$E$1)
*(Sheet1!$E:$E<$E$2)))/AFO4,0)
=如果(AFO4>0,
(表1!$N:$N=$A4)
*(左(图1!$H:$H,2)=“1A”)
*(第1张!$M:$M“服务目录”)
*(第1张!$J:$J=“事件”)
*(第1张!$I:$I“自助服务”)
*(表1!$AK:$AK=AFM$1)
*(第1张!$E:$E>=$E$1)
*(第1张!$E:$E=$E$1)

*(表1!$E:$E1st
SUMPRODUCT
可能成为


=COUNTIFS(Sheet1!$N:$N,$A4,Sheet1!$H:$H,“1A*”,Sheet1!$M:$M,“服务目录”,Sheet1!$J:$J,“事件”,Sheet1!$I:$I,“自助服务”,Sheet1!$AK:$AK,AFM$‌​1张1!$E:$E,“>=”和$E$1张1!$E:$E,“为什么不使用数据透视表来处理数字而不是公式?将数据加载到数据透视缓存可能会面临较长的一次性命中,但在这之后,您会发现数据透视表重新计算过滤器更改的速度要比这些计算量大的公式快得多。有什么理由不使用数据透视表吗?”

这是我正在写的一本书中的一些内容,我比较了SUMPRODUCT、SUMIFS、DSUM、数据透视表、高级过滤器和范围切片(对排序数据使用索引/匹配的巧妙组合)要根据您从10个不同下拉列表中所做的选择,有条件地对包含100多万条销售记录的表中的记录求和,请执行以下操作:

通过这些下拉列表,您可以根据商店、细分市场、种类、性别、付款、客户历史记录、订单状态、交货说明、会员类型和订单渠道列组合对数据库进行过滤。因此,为了将这100万条记录减少到一个总数,需要进行大量的过滤和聚合。The文件概述了实现这一结果的六种不同方式,前三种方式如下面的屏幕截图所示:

正如您所期望的,当所有这些下拉列表都设置为相同的设置时,您会从所有六种方法中得到完全相同的答案。但您不会期望的是,与其他方法相比,如果您更改其中一个下拉列表,SUMPRODUCT计算新答案的速度会有多慢。 事实上,在这个庞大的数据集上,SUMIFS方法比SUMPRODUCT方法快15倍,但这算不了什么:范围切片方法快56倍

范围切片方法的工作原理是对源数据进行排序,然后在助手列中使用一系列巧妙的公式,巧妙地确定任何感兴趣的记录在该排序数据中的位置。这意味着您可以直接对匹配的少数记录求和,而无需对其进行复杂的条件匹配数十万行(或者相对于一百万行,如本例所示)

下面是我的示例文件的外观。右侧Rows helper列中的数字显示,通过一些巧妙的消去,底部的SUM函数只需处理18行数据(第292996行到第293014行),而不是全部100万行。换句话说,这是非常有效的

下面是第二组备选方案:

是的,您可以很容易地在这里使用数据透视表。数据透视表方法似乎比SUMPRODUCT快6倍左右,尽管在调用筛选器时会有少量的额外延迟,而且第一次执行筛选器操作时又会花费相当长的时间,因为Excel必须将数据透视缓存加载到内存中。但是,让我们来看看面对现实:首先设置数据透视表是所有这些方法中最简单的一种,所以我投它一票


DSUM方法比SUMPRODUCT快12倍。这不如SUMIFS好,但仍然是一个显著的改进。高级筛选方法仅比SUMPRODUCT快4倍,这并不令人惊讶,因为它所做的是从源数据中提取符合该列表标准的所有记录,将其转储到电子表格中,然后对结果求和。

通常COUNTIFS会快大约3倍-您可以使用通配符代替左侧criterion@pnuts我还有一些限制,可能会妨碍我有效地使用过滤器。这6000个公式是200k公式工作表中最糟糕的部分。
SUMPRODUCTS
计算整个工作表需要90%以上的执行时间。
COUNTIFS
中的通配符是
*
so
(左(Sheet1!$H:$H,2)=“1A”)
可以作为
COUNTIF(Sheet1!$H:$H,1A*)放入
COUNTIFS
然后以
1A开头的任何东西都将被计数这是正确的,所以第一个SUMPRODUCT可以变成
=COUNTIFS(Sheet1!$N:$N,$A4,Sheet1!$H:$H,“1A*”,Sheet1!$M:$M,“服务目录”,Sheet1!$J:$J,“事件”,Sheet1!$I:$I,“自助服务”,Sheet1!$AK:$AK:$AK,AFM$1,Sheet1!$E:$E,$E:$E,“COUNTIFS和SUMIFS对每个条件短路(如果条件失败,则不继续评估下一个条件),所以你应该把最严格的条件放在第一位,下一个最严格的第二位等等。这真的很有趣。我不确定它是否适用。我有超过2000列的数据,但它分为不同的部分:关于员工的信息在第一列,然后是来自他们时间表的数据,然后是几个小时在他们的电话中(呼叫中心统计),然后在其他一些活动中(我们也从web表单中获得查询)以及其他更多的数据列(每个月都进行拆分)。此外,根据我的经验,pivot表在用于200x2000表时往往会出现问题(我们现在已经超过4个月了)