Microsoft Excel SQL查询中的多个数据源

时间:2016-01-09 13:37:21

标签: mysql excel multiple-databases

我有很多电子表格,使用Microsoft Query将我们的ERP软件中的交易信息提取到Excel中,然后我们自动执行其他计算。最近我们升级了我们的ERP系统,但管理层决定将旧的数据库中的事务历史保留在新系统中。我仍然需要一些"滚动12个月"图表,但如果我只使用旧数据库,我会丢失新数据,如果我只使用新数据,我会错过过去11个月的数据。

有没有办法可以在Excel中编写查询以从旧数据库PartTran表中提取数据,并将其与新数据库PartTran表合并,而不是每次都用用户干预?例如,我不希望我的用户(如果可能)必须有两个查询,他们将这些查询复制并粘贴到一个Excel表中。表的模式(至少是我需要的列)具有相同的名称和定义。

1 个答案:

答案 0 :(得分:0)

如果你想采取一些有趣的,hacky Excel方法,你可以在幕后为你的用户做“复制粘贴”位。给出两个类似的表OLDNEW结构

+-----+------+-------+------------+
| id  | foo  |  bar  |    date    |
+-----+------+-------+------------+
|  95 | blah | $25   | 2015-06-01 |
|  96 | bork | $12   | 2015-07-01 |
|  97 | bump | $200  | 2015-08-01 |
|  98 | fizz |       | 2015-09-01 |
|  99 | buzz | $50   | 2015-10-01 |
| 100 | char | ($1)  | 2015-11-01 |
| 101 | mope |       | 2015-12-01 |
+-----+------+-------+------------+

+----+-----+-------+------------+------+---------+
| id | foo |  bar  |    date    | fizz |  buzz   |
+----+-----+-------+------------+------+---------+
|  1 | cat | ($10) | 2016-01-01 | 285B | 1110111 |
|  2 | dog | $25   | 2016-02-01 | 27F5 | 1110100 |
|  3 | ant | $100  | 2016-03-01 | 1F91 | 1001111 |
+----+-----+-------+------------+------+---------+

...您可以将这两个数据集的数据与一些谨慎的excel魔法结合在一起,如下所示:

您的UNION表(使用 alt + j + t + a 命名)应该有以下项目:

  1. 新自然ID
  2. DataSet指针(旧表或新表的名称)
  3. 原始数据集中的派生ID
  4. 您想要的旧数据和数据列。新数据集
  5. 示例:

    +---------+------------+------------+----+------+-----+------------+------+------+
    | UnionId | SourceName | SourceRank | id | foo  | bar |    date    | fizz | buzz |
    +---------+------------+------------+----+------+-----+------------+------+------+
    |       1 | OLD        |            |    |      |     |            |      |      |
    |       2 | NEW        |            |    |      |     |            |      |      |
    +---------+------------+------------+----+------+-----+------------+------+------+
    

    然后,您将明智地使用Indirect()VlookUp()来获取查找ID和列目标。下面的示例代码

    SourceRank - 帮助列

    =COUNTIFS([SourceName],[@SourceName],[UnionId],"<="&[@UnionId])

    id - 来自原始DataSet的ID

    =SMALL(INDIRECT([@SourceName]&"[id]"),[@SourceRank])

    其他一切都只是VlookUp的疯狂!虽然我冒昧地复制下面的示例代码以供参考

    foo =VLOOKUP([@id],INDIRECT([@SourceName]),MATCH(UNION[[#Headers],[foo]],INDIRECT([@SourceName]&"[#Headers]"),0),0)

    bar =VLOOKUP([@id],INDIRECT([@SourceName]),MATCH(UNION[[#Headers],[bar]],INDIRECT([@SourceName]&"[#Headers]"),0),0)

    日期 =VLOOKUP([@id],INDIRECT([@SourceName]),MATCH(UNION[[#Headers],[date]],INDIRECT([@SourceName]&"[#Headers]"),0),0)

    fizz =VLOOKUP([@id],INDIRECT([@SourceName]),MATCH(UNION[[#Headers],[fizz]],INDIRECT([@SourceName]&"[#Headers]"),0),0)

    动态更新 =VLOOKUP([@id],INDIRECT([@SourceName]),MATCH(UNION[[#Headers],[fizz]],INDIRECT([@SourceName]&"[#Headers]"),0),0)

    输出

    您可能希望谨慎使用If()和/或IfError()来帮助您的用户忽略对旧表的新列引用以及那些还没有数据的行。但是,如果没有这个,你最终会得到类似下面的内容。

    UnionTable

    这是准备接受&amp;读取OLDNEW DataSet的新输入,可以排除那些讨厌的占位符行......

    UnionTable_Sorted

    希望这有帮助!快乐的编码!