索引/与IF声明匹配

时间:2017-02-22 07:38:59

标签: arrays excel excel-formula formula

enter image description here

如您所见,我左侧有一个数据库表。我想添加IF语句,允许我只查找A公司前5名的[代码],[名称]和[金额]。然后为B公司做前5名,依此类推。我已经成功地查找了所有公司中的前5名,但似乎无法为特定公司添加标准。

到目前为止,这是我的公式:

K列[公司]中的公式:= INDEX(Database,MATCH(N3,sales,0),1)

L栏中的公式[代码]:= INDEX(Database,MATCH(N3,sales,0),2)

M列中的公式[名称]:= INDEX(Database,MATCH(N3,sales,0),2)

N列中的公式[金额]:= LARGE(sales,ROW(1:20))

预期结果是显示每家公司的前5名销售人员及其[代码],[名称]和[金额],随时建议对工作表进行任何编辑。

2 个答案:

答案 0 :(得分:1)

如果您知道代码是唯一的,那么这是另一种选择。将A放入K3:K7后

首先从N3开始获得A公司的最高金额

=AGGREGATE(14,6,Database[Amount]/(Database[Company]=K3),ROWS(N$1:N1))

然后找到与金额相匹配的代码,但只有在之前没有使用它(这假设代码是唯一的)从L3开始

=INDEX(Database[Code],MATCH(1,INDEX((Database[Company]="A")*(Database[Amount]=N3)*ISNA(MATCH(Database[Code],L$2:L2,0)),0),0))

然后从M3

开始,找到具有正常INDEX / MATCH的匹配名称
=INDEX(Database[Name],MATCH(L3,Database[Code],0))

enter image description here

答案 1 :(得分:0)

好的,我已经通过使用你可以隐藏的辅助列实现了这一点。请注意,只有在任何一家公司的总数不超过9个时,这才会有效,我不认为你应该有这个问题,但可能会发生,辅助列添加的数字会需要调整

enter image description here

First Helper Column:

在总数的末尾添加一个数字,表示该公司上面已存在的金额的次数。此公式为=CONCATENATE([@Amount],COUNTIFS($A$1:A1,A2,$D$1:D1,D2))*1

将此值乘以1以保持LARGE的数字格式。

第二助手专栏:

这是一个数组公式,需要在公式栏中使用 Ctrl + Shift + Enter 输入。

这个的公式是: =LARGE(IF(Company="A",Helper),ROW(1:1))

此公式作为数组公式的作用是根据IF可以使用的LARGE语句生成结果列表。我们现在可以挑出具有公司" A"的行,而不是将整个列排在最大到最小的位置。像这样:

=LARGE({20000;20001;20002;FALSE;FALSE;FALSE;FALSE;FALSE;FALSE;FALSE;FALSE;FALSE;15000;14000;30000;FALSE;FALSE;FALSE;FALSE},ROW(1:1))

LARGE仅适用于数值,因此FALSES在A列不匹配时生成" A"将被忽略。请注意为什么我在这里使用了辅助列来消除唯一值但不影响前5个。

ROW(1:1)已被使用,因为当拖动公式以在此数组中产生下一个最高结果时,它会自动更新。

前五大阵列的主要公式

同样这是一个数组公式,因此需要在公式栏中使用 Ctrl + Shift + Enter 输入。

=INDEX(Database,SMALL(IF(Company="A",IF(Helper=$O3,ROW(Company))),1)-1,COLUMN(A:A))

对于某些未知原因IF(AND())的数组公式,对我来说不起作用,所以我已经嵌套了两个IF&#39。

注意我是如何再次检查第一列是否匹配" A"然后最后一列是否与第二个公式的结果相匹配。会发生什么是这两个条件在数组中匹配的情况(因为在同一行中都生成TRUE)我想要返回行号。

IF({TRUE;TRUE;TRUE;FALSE;FALSE;FALSE;FALSE;FALSE;FALSE;FALSE;FALSE;FALSE;TRUE;TRUE;TRUE;FALSE;FALSE;FALSE;FALSE},IF({FALSE;FALSE;FALSE;FALSE;FALSE;FALSE;FALSE;FALSE;FALSE;FALSE;FALSE;FALSE;FALSE;FALSE;TRUE;FALSE;TRUE;FALSE;FALSE},{2;3;4;5;6;7;8;9;10;11;12;13;14;15;16;17;18;19;20}))

我知道它看起来像一团糟,但两个TRUE对齐的位置给我们排第16行。

{FALSE;FALSE;FALSE;FALSE;FALSE;FALSE;FALSE;FALSE;FALSE;FALSE;FALSE;FALSE;FALSE;FALSE;16;FALSE;FALSE;FALSE;FALSE}

据我所知,这可能只有一个匹配,我使用SMALL来获取要用于行的INDEX公式中的第一个最小数字,并扣除1,因为我们没有考虑INDEX公式中的标题,所以我们实际上想要第15个结果。

同样,COLUMN(A:A)已被用于返回列号,因为当拖动公式时它会自动更新。

如果您正在努力解释我的想法并希望我提供更多清晰度,请随时与我联系,我会尽力更详细地解释逻辑