Одной из наиболее часто решаемых задач в Excel является сравнение таблиц между собой. Как правило это делается либо для выявления расхождений/совпадений между двумя таблицами, либо для получения данных из одной таблицы в другую на основании какого-то критерия. Чаще всего для этого используется функция
Если еще не работали с надстройкой PowerQuery и не знаете что это такое, то для начала лучше ознакомиться со статьей: Power Query - что такое и почему её необходимо использовать в работе?
Слияние запросов в PowerQuery.xlsx (52,6 КиБ, 1 170 скачиваний)
Для примера возьмем две таблицы:
Как видно здесь есть столбец, который совпадает в обеих таблицах –
Сначала загружаем по очереди обе таблицы в PowerQuery: вкладка Данные(или вкладка Power Query) -группа Загрузить и преобразовать -Из таблицы
После загрузки запрос каждой таблицы переименованием в более понятные названия Отделы и Сотрудники.
Чтобы к каждому сотруднику подставить название отдела из таблицы Отделы на основании ID необходимо выделить запрос Сотрудники -перейти на вкладку Главная -группа Объединить -Объединить запросы -Объединить в новый запрос
Появится окно объединения запросов
В этом окне вверху будет по умолчанию выбрана таблица, из которой было вызвано слияние. Выделяем столбец ID отдела, т.к. именно на основании него мы хотим сравнить таблицы. Далее выбираем из списка таблицу, с которой хотим сравнить таблицу Сотрудники. Это таблица Отделы. В ней выделяем так же столбец ID, т.к. сравнивать будем именно по этому столбцу.
Примечание: в качестве ключевого столбца может быть не один столбец, а сразу несколько. Здесь надо строго соблюдать очередность выделения столбцов-ключей – в обеих таблицах последовательность должна быть одинаковой. Для этого в заголовке каждого столбца PowerQuery подписывает порядковый номер, показывая порядок, в котором были выделены столбцы ключей.
И в самом низу выбираем из списка тип слияния. Всего доступно 6 типов:
- 1. Внешнее соединение слева (все из первой таблицы, совпадающие из второй)
2. Внешнее соединение справа (все из второй таблицы, совпадающие из первой)
3. Полное внешнее (все строки из обеих таблиц)
4. Внутреннее (только совпадающие строки)
5. Анти-соединение слева (только строки в первой таблице)
6. Анти-соединение справа (только строки во второй таблице)
Именно их мы подробно и разберем. Все описанные выше действия необходимо проделать для любого типа слияния, поэтому в дальнейшем я не буду их описывать, а только разберем результат для каждого типа слияния.
После операции слияния останется только "развернуть" полученные данные в отдельный столбец(нажав значок разнонаправленных стрелок в заголовке столбца и выбрав нужные столбцы):
1. Внешнее соединение слева (все из первой таблицы, совпадающие из второй)
Это по сути аналог ВПР к первой таблице. В результате будет создана таблица, в которой будут все строки первой таблицы и только те строки из второй, ID которых совпадает:
Однако здесь есть существенное отличие от ВПР(плюс или минус - зависит от ситуации). А заключается оно в следующем: если во второй таблице одному ключу соответствует более одного значения - то Power Qwery вернет для каждого такого ключа первой таблицы все строки этого ключа из второй. Например, вторая таблица содержит такие значения:
как видно, для ID 1 целых три записи. Как следствие мы получим для каждого ID 1 первой таблицы не одну строку, а 3. У нас там два сотрудника с ID 1: Ангелочкин П.Н. и Удачный С.А.:
а в итоге мы получим "раздутую" первую таблицу:
Чтобы этого избежать и получить только первую запись из всех(полный аналог ВПР в Excel) можно изменить запрос. Не разворачивать полученные в результате слияния таблицы, а выбрать из них только первое значение. Для этого сразу после слияния идем на вкладку Добавление столбца -Настраиваемые столбец и в качестве формулы записываем:
Кстати, даже эту строку можно записать еще короче:
Запрос в расширенном редакторе будет выглядеть примерно так:
let Источник = Table.NestedJoin(Сотрудники,{"ID отдела"},Отделы,{"ID"},"Отделы",JoinKind.LeftOuter), custom = Table.AddColumn(Источник, "Пользовательский", each try [Отделы]{0}[Отдел] otherwise null) in custom |
2. Внешнее соединение справа (все из второй таблицы, совпадающие из первой)
Тоже аналог ВПР, но уже ко второй таблице. В результате будет создана таблица, в которой выводит все строки второй таблицы и только те строки первой, которые есть во второй(опять же, на основании столбца ID):
Но здесь есть существенное отличие от работы ВПР. Как видно, у нас два сотрудника из одного отдела и один сотрудник, для которого отдел отсутствует. PowerQuery взяла таблицу отделов и отобрала только те, для которых совпал ID у таблицы сотрудники. Но при этом для каждого отдела добавились ВСЕ сотрудники с одним ID. ВПР в таких случаях возвращает всегда только первое найденное совпадение и для отдела с ID 1 у нас просто получилось бы два одинаковых сотрудника(Ангелочкин П.Н.).
Если нужно только первое(точный аналог ВПР), то решение такое же, как и в случае с Внешним соединением слева - через добавление столбца и отбора первой найденной записи.
3. Полное внешнее (все строки из обеих таблиц)
Выводит все строки из обеих таблиц. Примерно то же самое, если бы мы применили к обеим таблицам ВПР и после этого добавили к первой таблице те значения из второй, которые не найдены в первой:
4. Внутреннее (только совпадающие строки)
Выводит только те строки, которые есть в обеих таблицах(на основании ID)
При этом те строки, для которых не найдено совпадений, просто удаляются
5. Анти-соединение слева (только строки в первой таблице)
Выявляет те строки первой таблицы, для которых нет соответствия во второй таблице:
6. Анти-соединение справа (только строки во второй таблице)
Выявляет те строки второй таблицы, для которых нет соответствия в первой
Как видно, PowerQuery предоставляет довольно неплохие возможности по сравнению таблиц и может вполне составить конкуренцию ВПР, особенно учитывая возможность сравнения сразу по нескольким столбцам и гораздо более быстрый алгоритм работы с большими наборами данных.
Однако следует помнить, что инструмент слияние учитывает регистр букв и не может сравнивать значения по части строки и при помощи подстановочных символов(звездочка и вопросительный знак). ВПР в этом плане гораздо гибче.
Слияние запросов в PowerQuery.xlsx (52,6 КиБ, 1 170 скачиваний)
Так же см.:
Собрать данные из файлов защищенных паролем PowerQuery
Собрать данные с таблиц с изменяющимися столбцами в PowerQuery
Относительный путь к данным PowerQuery