Excel索引与范围查找表匹配

时间:2017-02-16 00:28:10

标签: excel conditional lookup

我在下面创建了一个虚构示例,其中包含定价查找表 Table2 和一个事务表 Table1 。表格如下。

表1

+----------+--------+
| CATEGORY | VOLUME |
+----------+--------+
| Orange   | 12     |
+----------+--------+
| Orange   | 25     |
+----------+--------+
| Grape    | 40     |
+----------+--------+
| Grape    | 700    |
+----------+--------+

表2

+----------+-------+-------+
| CATEGORY | RANGE | PRICE |
+----------+-------+-------+
| Orange   | 10    | 2.50  |
+----------+-------+-------+
| Orange   | 20    | 2.00  |
+----------+-------+-------+
| Orange   | 30    | 1.50  |
+----------+-------+-------+
| Grape    | 50    | 5.00  |
+----------+-------+-------+
| Grape    | 100   | 2.00  |
+----------+-------+-------+

希望引用查找表并拉出与给定CATEGORY的小于或等于VOLUME的RANGE相关联的PRICE。如果VOLUME大于查找表中的任何RANGE,它会将PRICE拉到最高RANGE。

所需输出

+----------+--------+-------+
| CATEGORY | VOLUME | PRICE |
+----------+--------+-------+
| Orange   | 12     | 2.00  |
+----------+--------+-------+
| Orange   | 25     | 1.50  |
+----------+--------+-------+
| Grape    | 40     | 5.00  |
+----------+--------+-------+
| Grape    | 700    | 2.00  |
+----------+--------+-------+

我的脑袋立刻开始使用双一元 - (数组函数,但当两个表都是数十万条记录时,性能不起作用。

任何想法都非常感激。使用Excel 2016。

2 个答案:

答案 0 :(得分:1)

我建议对两个工作表/表使用SQL语句,并使用security粘贴结果。

SQL:

CopyFromRecordset

Microsoft ActiveX数据对象的最大版本中添加引用(工具 - > 引用... )(在我的计算机上)这是6.1)。

它假设有三个工作表 - SELECT t1.CATEGORY, t1.VOLUME, ( SELECT PRICE FROM [Table2$] AS t2 WHERE t1.CATEGORY = t2.CATEGORY AND ( t1.VOLUME <= t2.RANGE OR t2.RANGE = MAXRANGE ) ORDER BY t2.RANGE ) AS FINALPRICE FROM [Table1$] AS t1 LEFT JOIN ( SELECT CATEGORY, MAX(RANGE) AS MAXRANGE FROM [Table2$ AS t2a] GROUP BY CATEGORY ) AS MAXRANGES ON t1.CATEGORY = MAXRANGES.CATEGORY Table1Table2。 (也可以使用命名范围或特定单元格范围作为表格。)

Results

答案 1 :(得分:1)

不确定您是否可以将表2转换为数据透视表。如果可以的话,下面的内容应该可行

将表2转换为数据透视表。添加两个辅助列(&#34;行&#34;和&#34;列&#34;)

Row =MATCH(E11,$E$3:$E$5,0)

这为您提供了数据透视表中的类别行

Column =IFERROR(1/AGGREGATE(14,6,1/(($F$2:$O$2>F11)*COLUMN($F$2:$O$2)*(OFFSET($F$2:$O$2,H11,0)>0)),1)-COLUMN($E$2),COLUMN($O$2)-COLUMN($E$2))

我在这里也使用数组操作(你对性能有所顾虑),但这只限于两个行数组而不是你拥有的整个数据。仍然不能谈论表现

$F$2:$O$2>F11给出了大于当前音量的所有范围

COLUMN($F$2:$O$2)给出了列号

OFFSET($F$2:$O$2,H11,0)>0检查当前类别行,哪些单元格具有值。

上述三个条件的组合为您提供了一个范围大于所需量的列号,并且具有相应的价格。

1/AGGREGATE()部分为您提供了从第一列COLUMN($E$2)中减去的最小列数。

如果音量大于最大范围,公式将给出在IFERROR部分中捕获的错误。 COLUMN($O$2)-COLUMN($E$2)为您提供数据透视表中的最后一个列号。

获得行号和列号后,可以通过以下公式获得价格

=INDEX($E$3:$O$5,H11,I11+1)

请注意此公式中列号的+1

这是一张正确查看参考文献的图片

Sceenshot

为了检查性能,我生成了391个类别的数据集,每个类别有40个范围。没有做得好......但你的情况可能会有所不同

Performance screenshot

如果您需要帮助理解,请告诉我。我的解释可能还不够:P