Как смоделировать полное внешнее объединение в Excel?


34

Давайте предположим, что у меня есть некоторые данные в Excel (а не в реальной базе данных). На одном листе у меня есть данные, где один столбец работает как идентификатор, и я убедился, что значения в этом столбце уникальны. На другом листе у меня также есть некоторые данные, опять же с одним столбцом, который может быть взят в качестве идентификатора, и он также уникален. Если строка N на листе 1 имеет какое-то значение, а строка M на листе 2 имеет то же значение, я уверен, что строка N и строка M описывают один и тот же объект реального мира.

Что я спрашиваю: как я могу получить эквивалент полного внешнего соединения без написания макросов? Формулы и все функции, доступные через ленту, в порядке.

Небольшой пример "play data":

Лист 1:

Dostoyevski    Russia
Pushkin        Russia
Shelley        England
Flaubert       France
Hugo           France
Eichendorff    Germany
Byron          England
Zola           France

Лист 2:

Shelley        Percy Bysshe
Eichendorff    Josef Freiherr Von
Flaubert       Gustave
Byron          Lord
Keller         Gottfried
Dostoyevski    Fyodor
Zola           Emile
Balzac         Honoré de

Желаемый вывод (сортировка не важна):

Dostoyevski    Russia   Fyodor
Pushkin        Russia
Shelley        England  Percy Bysshe
Flaubert       France   Gustave
Hugo           France
Eichendorff    Germany  Josef Freiherr von
Byron          England  Lord
Zola           France   Emile
Keller                  Gottfried
Balzac                  Honoré de

Всем, кто в ужасе от этого сценария: я знаю, что это неправильный способ сделать это. Если бы у меня был какой-либо выбор, я бы не стал использовать Excel для этого. Тем не менее, существует достаточно ситуаций, когда необходимо прагматичное решение, невозможно применить стат и лучшее (с точки зрения ИТ) решение.


Если вы сортируете оба списка и размещаете их рядом, будет довольно легко вручную сопоставить нужный столбец. Если у вас много данных, вы можете написать функцию, которая принимает два диапазона и делает это за вас.
Дан

@ Дэн, как я уже сказал, я прошу сделать это без написания функции . В ситуациях, когда я могу это написать, решение тривиально (по крайней мере, для меня, потому что я уже писал на VBA)
rumtscho

Excel поддерживает запросы SQL через соединения данных. Я ужасен в этом, поэтому я, к сожалению, не могу предложить гораздо больше советов, но, возможно, стоит обратить внимание на вас.
Кайл

@Kyle Я добавил эту опцию в свой ответ. Это не для слабонервных и для этого может быть беспорядок, чтобы играть и / или полный перебор, но эй, почему бы и нет!
enderland

Ответы:


44

Простой подход - стандартные операции Excel

Сначала скопируйте / вставьте оба ключевых столбца из обеих таблиц в один новый лист в виде одного столбца.

Используйте «Удалить дубликаты», чтобы получить единый список всех ваших уникальных ключей.

Затем добавьте два столбца (в данном случае), по одному для каждого столбца данных в каждой таблице. Я также рекомендую использовать формат в качестве табличного параметра, поскольку он делает ваши формулы более привлекательными. Используя vlookup, используйте следующую формулу:

=IFERROR(VLOOKUP([@ID],Sheet4!A:B,2,FALSE),"")

Где Sheet4!A:Bпредставляет собой таблицу данных исходной таблицы для каждого соответствующего значения. IFERROR предотвращает появление неприятных # N / A результатов, которые появляются, когда vlookup не удается, и в этом случае возвращает пустую ячейку.

Это дает вам вашу итоговую таблицу.


Sheet3:

введите описание изображения здесь

Лист4:

введите описание изображения здесь

Данные результата:

введите описание изображения здесь

Формулы результата ( Ctrl+ ~переключит это):

введите описание изображения здесь


Встроенный SQL-запрос

Вы также можете сделать это с помощью встроенного SQL-запроса. Это ... гораздо менее удобно для пользователя, но, возможно, будет лучшим вариантом использования. Это, вероятно, потребует от вас отформатировать ваши «исходные» данные в виде таблиц.

  1. Нажмите на ячейку на новом листе
  2. Перейти к данным -> из других источников -> из запроса Microsoft
  3. Выберите файлы Excel * на вкладке Базы данных и нажмите ОК
  4. Выберите вашу рабочую книгу
  5. Выберите следующие четыре поля:
    • введите описание изображения здесь
  6. Нажмите «Далее» и «ОК», чтобы увидеть красивое отформатированное предупреждение 1990-х годов.
  7. Следуя этим инструкциям, создайте первое левое внешнее соединение. В моем случае я использую таблицу «страны» в качестве левого источника и «имена» в качестве правого.
    • введите описание изображения здесь
    • Это дает только некоторые строки (так как вы присоединяетесь к ID)
  8. Часть «создать вычитаемое соединение, а затем добавить его как объединение» более сложна ..

    • Вот конфигурации вычитания соединения: введите описание изображения здесь
    • Скопируйте SQL этого соединения из кнопки SQL:
    • ВЫБРАТЬ countries$.id, countries$.Val1, names$.id, names$. Val2 ОТ {oj C:\Users\Username\Desktop\Book2.xlsx. countries$ countries$LEFT OUTER JOIN C:\Users\Username\Desktop\Book2.xlsx. names$ names$ON countries$.ID = names$.ID} ГДЕ ( names$.ID является нулевым)

  9. Вернитесь к первому внешнему соединению, которое вы создали. Вручную отредактируйте SQL и

    • добавить Unionв конец
    • Добавьте приведенный выше текст объединения вычитания в конец объединения
  10. Нажмите кнопку «Возврат данных» сразу слева от кнопки SQL.
    • Вы можете отредактировать SQL, чтобы выбрать только конкретные данные, которые вы хотите на данный момент. Мне проще скрыть столбцы в результате.
  11. Разместите запрос и подтвердите его местоположение.
    • введите описание изображения здесь

Не для слабонервных. Но если вы хотите получить отличную возможность увидеть некоторые не обновленные до тех пор, пока вы можете быть живыми части Office, это отличный шанс.


1
У вас есть ссылка на нотацию [@ID]? Я не сомневаюсь, что это работает, но я никогда не видел это раньше, и я делаю много работы в Excel.
TJL

1
@TJL, если вы отформатируете таблицу как таблицу, она будет использовать такую ​​запись для ссылок на другие столбцы. Гораздо понятнее, чем ссылки на ячейки. Это может быть функция 2010+? Я не уверен. Я не использовал магию форматирования как таблицы достаточно до 2010 года ..
enderland


Разве вы не можете просто изменить слово LEFT на слово FULL в исходном запросе? Я уверен, что он просто использует драйвер ACE OLEDB для выполнения этого запроса, который поддерживает синтаксис FULL JOIN.
Кайл Хейл

14

В качестве альтернативного решения, могу ли я предложить Power Query ? Это бесплатная надстройка Excel от Microsoft, предназначенная для выполнения именно такого рода задач. Его функциональные возможности будут непосредственно включены в Excel 2016, так что он защищен от будущего.

В любом случае, с Power Query шаги довольно просты:

  1. Импортируйте обе таблицы как запросы в Power Query Editor.
  2. Выполните преобразование запросов слияния для них, установив соответствующий столбец соединения и установив тип соединения как Full Outer.
  3. Загрузите таблицу результатов на новый лист.

Хорошая вещь об этом - после того, как вы настроите это, если вы вносите изменения в свои базовые таблицы данных, вы просто нажимаете Данные> Обновить все, и ваш лист результатов Power Query также обновляется.


Очень интересно. Мой друг, владеющий рестораном, спрашивал меня о MS Office и показывал мне его набор на 2016 год, который не включает MS Access. Теперь я понимаю, почему это так. В Excel было много ограничений. Я никогда не покупал выше 2003 года, потому что ни одна из функций не имела ценности, и мне не понравился новый внешний вид; 2010 и выше. Access делает все это и даже больше, поэтому возникает вопрос: почему так много людей пытаются работать с базами данных в Excel, когда Access - это способ добиться этого? Единственное, что я вижу, это то, что, возможно, для того, чтобы получить хорошую работу с БД Access, ей также нужен хороший опыт работы с VB.
ejbytes

@ejbytes большинство людей понимают концепцию электронных таблиц. Большинство из них ... не понимают концепции базы данных. У меня был проект по преобразованию проекта электронной таблицы в базу данных, и пользователи все еще называли его «электронной таблицей» - даже после подробных объяснений того, как работает база данных!
enderland

@enderland Я думаю, ты прав. Электронная таблица с не строгими правилами и несмежной гибкостью ... и запросы, замаскированные под фильтры. Платформа для сменных таблиц и списков.
ejbytes

@ejbytes tldr версия - это MS, которая хотела протестировать механизм памяти columnstore в Excel, чтобы добавить больше строк, она включала соединения с внешними данными, оказалась чрезвычайно популярной, поэтому они добавлены в инструмент ETL. Теперь они свернули все инструменты как PowerBI.
Кайл Хейл

@KyleHale Я использую Office 2010 и пытаюсь выполнить FULL OUTER JOIN, но Power Query игнорирует идентификаторы из второй таблицы, которых нет в первой таблице.
GeMir

0

Быстрый способ полу-симуляции (внешнего соединения) состоит в том, чтобы взять второй список и вставить его непосредственно под первым списком, т. Е. Чтобы ваши (первичные ключи) были в одном (первичном) столбце. Затем отсортируйте этот основной столбец, в результате вы получите список с чередованием, а затем выполните транспонированное уравнение ПЧ (суперпользователь испортил представление макета таблицы ...):

listA listB


сэм синий тим 32874 тим красный мэри 5710 крис грин густав 047 фред блю мэри
чёрный

копия / вставка / сортировка, результат выглядит так: AB Крис Грин Фред Блю Густав 047 Мэри 5710 Мэри черный Сэм Блю Тим 32874 Тим красный

тогда формула для ячейки c1: (c1) = if (A1 = A2, B2)

Результат выглядит так:

ABC Крис Грин ЛОЖЬ фред синий ЛОЖЬ густав 047 ЛОЖЬ Мэри 5710 черный Мэри черный ЛОЖЬ сэм синий ЛОЖЬ тим 32874 красный тим красный ЛОЖЬ

Сортировка C, чтобы избавиться от ложных и т.д. Это базовая версия идеи, просто расширьте ее, если вам нужно больше данных. -wag770310


Вы можете отформатировать это любым способом, чтобы сделать его читабельным?
Давидбауманн
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.