我在下面创建了一个虚构示例,其中包含定价查找表 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。
答案 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
,Table1
和Table2
。 (也可以使用命名范围或特定单元格范围作为表格。)
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
这是一张正确查看参考文献的图片
为了检查性能,我生成了391个类别的数据集,每个类别有40个范围。没有做得好......但你的情况可能会有所不同
如果您需要帮助理解,请告诉我。我的解释可能还不够:P