嵌套的excel函数与条件逻辑

时间:2014-01-31 20:03:38

标签: excel excel-formula

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

所以 - 以下是我的出发点:

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

我想弄清楚的是做这样的事情的语法 -

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

我说得对吗?语法有点令人困惑,我不确定我是否为该任务选择了正确的函数。

enter image description here

2 个答案:

答案 0 :(得分:1)

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

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

接下来确定组和

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

如果密钥组的总和恰好为1

,则密钥是唯一的
D2: =(C2=1)

要计算与某个标准匹配并且唯一的记录,请在=IF(AND(D2, [yourcondition];1;0)中添加D列并对此列求和

另一种选择是,如果一个密钥在排序列表中是唯一的,如果它与它的前任和后继版本都不相等,那么你可以找到像

这样的唯一记录。
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)

example

第2行中的所有公式都应该向下复制到列表的末尾

答案 1 :(得分:1)

我不得不在一周前解决同样的问题。

即使您无法始终对分组列(在您的情况下为J)进行排序,此方法仍然有效。如果您可以对数据进行排序,那么@MikeD的解决方案将会更好地扩展。

首先,你知道计算唯一数字的FREQUENCY技巧吗? FREQUENCY旨在创建直方图。它需要两个数组,'数据'和'箱'。它对'bins'进行排序,然后创建一个比'bins'长一个的输出数组。然后它获取'data'中的每个值并确定它属于哪个bin,相应地递增输出数组。它返回数组。这是重要的部分:如果一个值不止一次出现在'bins'中,那么意味着该bin的任何'data'值都会出现在第一次出现。诀窍是对“数据”和“容器”使用相同的数组。仔细考虑一下,您会看到输入中每个唯一数字的输出中有一个非零值。请注意,它只计算数字。

简而言之,我用这个:

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

计算<array>

中的唯一数值

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

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

conditional unique

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

($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将其作为数组公式输入。用SUMPRODUCT替换SUM不会削减它。

在您的示例中,您将使用以下内容:

=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),"")
)))

但是,我会注意到,缩放可能是与您的数据集一样大的问题。我在更大的数据集上进行了测试,它在10k行的数量级上相当快,但是在100k行的顺序上非常慢,例如你的行。内部数组速度很快,但FREQUENCY函数速度变慢。我不确定,但我猜它在O(n log n)和O(n ^ 2)之间,具体取决于排序的实现方式。

也许这没关系 - 这些都不是易变的,所以它只需要在刷新数据时计算一次。但是,如果列数据发生变化,这可能会很痛苦。