2016-01-09 3 views
0

У меня есть большое количество электронных таблиц, которые извлекают транзакционную информацию из нашего ПО ERP в Excel с помощью Microsoft Query, после чего мы автоматически выполняем другие вычисления. Недавно мы обновили нашу систему ERP, но руководство приняло решение оставить историю транзакций в старых базах данных, чтобы иметь чистую передачу в новой системе. Мне все еще нужно иметь некоторые графики «прокатки 12 месяцев», но если я использую только старую базу данных, мне не хватает новых данных, и если я использую только новые, то мне не хватает последних 11-месячных данных.Несколько источников данных в Microsoft Excel SQL Query

Есть ли способ, который я могу написать запрос в Excel, чтобы вытащить данные из старой таблицы PartTran базы данных и объединить их с новой базой данных PartTran table без пользовательского вмешательства каждый раз? Например, я не хочу, чтобы мои пользователи (если возможно) имели два запроса, которые они копируют и вставляют в одну таблицу Excel. Схема таблиц (по крайней мере, для столбцов, которые мне нужны) идентично названы и определены.

+0

Что вы пробовали? Есть пара способов с головы до головы, которые можно решить (с разной степенью стабильности); и это поможет узнать ответы на ваш текущий подход. –

+0

Я думаю, что Microsoft PowerQuery для такой ситуации. За кулисами он загружает MS SQL Server Express локально и управляет загрузкой и объединением данных. Я не работал с ним (я работал с PowerPivot, который делает что-то подобное), но он показывает обещание. Проверьте ссылку. https://support.office.com/en-us/article/Introduction-to-Microsoft-Power-Query-for-Excel-6E92E2F4-2079-4E1F-BAD5-89F6269CD605. Имейте в виду, что в худшем случае вашим источником может быть сам Excel, то есть, как только вы получите данные в Excel, это «источник» – Hambone

+0

Microsoft PowerQuery сделает это. –

ответ

0

Если вы хотите сделать немного веселый, взломанный подход к Excel, вы можете сделать бит «copy-paste» для своих пользователей за кулисами. Учитывая две аналогичные таблицы 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 | 
+----+-----+-------+------------+------+---------+ 

... вы можете объединение вместе данные для этих двух наборов данных с некоторыми благоразумно первенствует колдовство, как показано ниже:

Ваш UNION стол (названный с использованием alt + j + t + ) должны иметь следующие пункты:

  1. Новый природный ID
  2. DataSet указатель (название старой или новой таблицы)
  3. производный ID из исходного массива данных
  4. Столбцы данных, которые вы хотите от Старого & новых DataSets

пример:

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

Затем вы получите разумное использование Indirect() и VlookUp() для получения идентификаторов поиска и целей столбца. Пример кода ниже

SourceRank - помощник колонка

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

ID - идентификатор из оригинального DataSet

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

Все остальное просто ВПР безумие !!Несмотря на то, что я взял на себя смелость копировать образец кода ниже для справки

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)

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

Это и готово принять & читать новые материалы для обоего OLD и NEW DataSets и сортировка, чтобы избавиться от этих надоедливых строк заполнителей ...

UnionTable_Sorted

Надеется, что это помогает! Счастливое кодирование!

+0

Это, конечно же, всего лишь обходное решение для простого ввода ваших данных в [надлежащее представление в базе данных] (http://dev.mysql.com/doc/refman/5.7/en/create-view.html) перед импортом в Excel. Но этот способ тоже забавен :-) –