嵌套的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行中的所有公式复制到列表的末尾