嵌套的Excel函数与条件逻辑

刚开始使用Excel,我正在处理数据库提取,只有在另一列中的项目是唯一的时候,我才需要计算值。

所以 – 下面是我的出发点:

= SUMPRODUCT(COUNTIF(C3:C94735,{“可共享内容对象参考模型1.2”,“创作的SCORM / AICC内容”,“创作的外部Web内容”}))

我想弄清楚的是这样做的语法 –

= sumproduct(Countif range1 criteria …,其中range2 criteria =“是唯一值”)

我得到这个权利? 语法有点混乱,我不确定我select了正确的function。

在这里输入图像说明

我一个星期前就必须解决同样的问题。

这种方法即使在你不能总是在分组列上sorting(J在你的情况)。 如果你能保持数据的分类,@MikeD的解决scheme将会更好。

首先,你知道计算唯一数字的频率技巧吗? FREQUENCY旨在创build直方图。 它需要两个数组,“数据”和“箱”。 它对“bin”进行sorting,然后创build一个比“bin”长的输出数组。 然后,它将“数据”中的每个值取出,并确定它属于哪个bin,相应地增加输出数组。 它返回数组。 这里有一个重要的部分:如果一个值出现在“bin”中的次数不止一次,那么这个bin中的任何“data”值都会首先出现。 诀窍是使用相同的数组“数据”和“箱”。 仔细想想,你会发现在input中每个唯一的数字在输出中有一个非零值。 请注意,它只计算数字。

总之,我用这个:

=SUM(SIGN(FREQUENCY(<array>,<array>))) 

<array>计算唯一的数值

由此,我们只需要在适当的地方构build包含数字的数组,并在别处构build文本。

在下面的例子中,我正在计算独特的日子,当颜色是红色和水果是柑橘:

条件独特

这是我的条件数组,返回1或为我感兴趣的行真:

 ($A$2:$A$10="red")*ISNUMBER(MATCH($B$2:$B$10,{"orange","grapefruit","lemon","lime"},0)) 

请注意,这需要ctrl-shift-enter用作数组公式。

由于我分组的唯一性值是文本(就像你的),我需要将其转换为数字。 我用:

 MATCH($C$2:$C$10,$C$2:$C$10,0) 

请注意,这也需要ctrl-shift-enter

所以,这是我正在寻找唯一性的数值的数组:

 IF(($A$2:$A$10="red")*ISNUMBER(MATCH($B$2:$B$10,{"orange","grapefruit","lemon","lime"},0)),MATCH($C$2:$C$10,$C$2:$C$10,0),"") 

现在我把它插入我的唯一性计数器:

 =SUM(SIGN(FREQUENCY(<array>,<array>))) 

要得到:

 =SUM(SIGN(FREQUENCY( IF(($A$2:$A$10="red")*ISNUMBER(MATCH($B$2:$B$10,{"orange","grapefruit","lemon","lime"},0)),MATCH($C$2:$C$10,$C$2:$C$10,0),""), IF(($A$2:$A$10="red")*ISNUMBER(MATCH($B$2:$B$10,{"orange","grapefruit","lemon","lime"},0)),MATCH($C$2:$C$10,$C$2:$C$10,0),"") ))) 

再次,这必须使用ctrl-shift-enter作为数组公式ctrl-shift-enter 。 用SUMPRODUCTreplaceSUM不会削减它。

在你的例子中,你会使用像这样的东西:

 =SUM(SIGN(FREQUENCY( IF(ISNUMBER(MATCH($C$3:$C$94735,{"Sharable Content Object Reference Model 1.2","Authored SCORM/AICC content","Authored External Web Content"},0)),MATCH($J$3:$J$94735,$J$3:$J$94735,0),""), IF(ISNUMBER(MATCH($C$3:$C$94735,{"Sharable Content Object Reference Model 1.2","Authored SCORM/AICC content","Authored External Web Content"},0)),MATCH($J$3:$J$94735,$J$3:$J$94735,0),"") ))) 

但是,我会注意到,缩放可能是与您的数据集一样大的问题。 我在更大的数据集上进行了testing,它在10k行的数量级上相当快,但在100k行的数量级上真的很慢,比如你的。 内部arrays很快,但频率function减慢。 我不确定,但我猜这是在O(n log n)和O(n ^ 2)之间,取决于如何实现sorting。

也许这并不重要 – 这些都不稳定,所以在刷新数据时只需要计算一次。 如果列数据正在改变,这可能是痛苦的。

假设源数据按键值[A]sorting,则从确定键列的出现开始

 B2: =IF(A2=A1;B1+1;1) 

接下来确定一个总和

 C2: =SUMIF($A$2:$A$9;A2;$B$2:$B$9) 

一个密钥是唯一的,如果它的总和恰好是1

 D2: =(C2=1) 

为了对与某个标准相匹配并且是唯一的logging进行计数,在a =IF(AND(D2, [yourcondition];1;0)包括D列=IF(AND(D2, [yourcondition];1;0)并将该列

另一个select是如果在sorting列表中有一个独特的关键字,如果它与其前任和后继者不相等,那么你可以find唯一的logging

 E2: =AND(A2<>A1;A2<>A3) G2: =IF(AND(E2;F2="this");1;0) 

E和G当然可以合并成一个单一的公式(不知道如果这有帮助…)

 G2(2): =IF(AND(AND(A2<>A1;A2<>A3);F2="this");1;0) 

解决不必要的嵌套AND的:

 G2(3): =IF(AND(A2<>A1;A2<>A3;F2="this");1;0) 

例

应将第2行中的所有公式复制到列表的末尾