我有很多电子表格可以使用Microsoft Query将交易信息从我们的ERP软件中提取到Excel中,然后我们自动执行其他计算。最近,我们升级了我们的ERP系统,但是管理层决定将事务历史记录保留在旧数据库中,以便在新系统中继续进行更新。我仍然需要一些“滚动12个月”图,但是如果仅使用旧数据库,则将丢失新数据,如果仅使用新数据库,则将丢失最近11个月的数据。
有没有一种方法可以在Excel中编写查询以从旧数据库PartTran表中提取数据并将其与新数据库PartTran表合并,而无需每次用户干预?例如,我不希望我的用户(如果可能的话)必须拥有两个要复制并粘贴到一个Excel表中的查询。表的模式(至少我需要的列)具有相同的名称和定义。
最佳答案
如果您想采用一种有趣的,笨拙的Excel方法,可以为幕后的用户提供“复制粘贴”功能。给定两个类似的具有结构的表OLD
和NEW
+-----+------+-------+------------+
| 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命名)应具有以下各项:新的自然身份证
DataSet指针(旧表或新表的名称)
来自原始数据集的ID
您希望从旧数据集和新数据集中获得的数据列
例:
+---------+------------+------------+----+------+-----+------------+------+------+
| UnionId | SourceName | SourceRank | id | foo | bar | date | fizz | buzz |
+---------+------------+------------+----+------+-----+------------+------+------+
| 1 | OLD | | | | | | | |
| 2 | NEW | | | | | | | |
+---------+------------+------------+----+------+-----+------------+------+------+
然后,您将明智地使用Indirect()和VlookUp()派生查找ID和列目标。下面的示例代码
SourceRank-帮助器列
=COUNTIFS([SourceName],[@SourceName],[UnionId],"<="&[@UnionId])
id-原始数据集中的ID
=SMALL(INDIRECT([@SourceName]&"[id]"),[@SourceRank])
其他一切只是VlookUp的疯狂!尽管我已自由复制以下示例代码以供参考
foo
=VLOOKUP([@id],INDIRECT([@SourceName]),MATCH(UNION[[#Headers],[foo]],INDIRECT([@SourceName]&"[#Headers]"),0),0)
栏
=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)
嘶嘶声
=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()
,以帮助您的用户忽略对旧表的新列引用以及那些尚未包含数据的行。但是,如果没有这些,您将得到类似下面的内容。这既可以接受并读取
OLD
和NEW
数据集的新输入,也可以进行排序以摆脱那些讨厌的占位符行...希望这可以帮助!编码愉快!
关于mysql - Microsoft Excel SQL查询中的多个数据源,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34694123/