免责声明:虽然这不是帖子中描述的问题的直接解决方案,但我想将此方法添加为对所描述问题的更快、更简单的解决方案。
第 1 步:创建一个(可能是隐藏的)工作表,您可以在其中提取此 Excel 文件中所需的所有 SQL 数据。将数据拉入具有所有必要列/维度的一个表中,以便之后从该表中获取数据。
这就是我的意思。假设您在这个 Excel 文件中需要 SQL 服务器上表 Users 中的一些数据以及服务器上 StockMarket 表中的一些信息。从表Users 中,您需要用户ID、名字、姓氏和职位。在StockMarket 表中,您将需要股票市场 ID 和该特定股票的价格。由于这些价格是按日期计算的,因此您还需要价格的报价日期。
现在,既然您希望所有数据都在一个表中,您必须想出一种聪明的方法来将所有这些数据合并到一个表中。一种方法可能如下:
之后,您可以使用以下查找函数从上表中获取所有数据:
=INDEX(SQLdata,MATCH(1,(SQLdata[Table]="Users")*(SQLdata[UserID]=25),0),4)
请注意,我将表命名为 SQLdata,以便在查看和理解公式时更容易。此外,像这样,您可以轻松扫描 Excel 文件以查找对该表的任何引用。
另一种方法可以使表格更简洁:
请注意,这次我将Strings 与Numbers 以及Strings 与Dates 混合使用(这是非常糟糕的设计,对于这里的某些人来说甚至无法想到)。此外,列标题现在不太具有描述性。然而,这也有效:
=INDEX(SQLrev,MATCH(1,(SQLrev[Table]="Users")*(SQLrev[Dimension1]=25),0),5)
注意,我这次调用的是表 SQLrev。
这两种解决方案还允许您从表中聚合数据。因此,如果您想要(例如)Apple 在 2017 年的平均价格,那么您可以使用以下公式将今年的报价相加并除以 3:
=SUM(IF("StockMarket"=SQLrev[Table];1;0)*IF("AAPL"=SQLrev[Dimension1];1;0)*SQLdata[Price])/3
这种方法最显着的优势是您只需更新整个 Excel 文件中的一个表,这意味着只有 一个来自服务器的 SQL 拉取。
最显着的缺点(除了编写起来可能相当复杂的 SQL 选择之外)是您需要知道需要驻留在此表中的所有数据。如果未将数据拉入此表,则上述公式都无法检索这些值。
虽然这种方法肯定有其缺点,但它比您的目标 Excel 插件更容易实现。
以上所有公式都是数组公式,必须按Ctrl + Shift + Enter 输入。有关数组公式的更多信息,请阅读以下内容:https://support.office.com/en-us/article/Guidelines-and-examples-of-array-formulas-7D94A64E-3FF3-4686-9372-ECFD5CAA57C7