Как объединить таблицы?

Автор 584, 29 августа 2018, 21:05

0 Пользователи и 1 гость просматривают эту тему.

584

Господа, простите заранее! )
Задача скорее всего 1000 раз уже обсуждалась, но я не могу найти решения уже много лет и не понимаю каким языком ее сформулировать, чтобы найти. Задача следующая:

Есть две таблицы, например:

Вася | програмист
Петя | плотник

Вася | 35 лет
Коля | 30 лет

Нужно их объединить в Libre Calc так, чтобы получилось вот так:

Вася | Вася | програмист | 35 лет
Петя |         | плотник     |
        | Коля |                  | 30 лет

Ну или если упростить эту таблицу, то вот так:

Вася | програмист | 35 лет
Петя | плотник     |
Коля |                  | 30 лет

Можете объяснить ПРОСТЫМИ словами, желательно в виде пошаговой инструкции, как это делается? Может есть какой-то плагин или онлайн сервис, который это делает? Буду безумно благодарен!

JohnSUN

Добро пожаловать на форум!
Действительно, делалось многократно и самыми разными способами.
Прежде чем предложить какой-нибудь из них, хотелось бы немного уточнить задачу.
Что делать, если для Васи встретится несколько записей? Ну, по недосмотру или из-за какого-то сбоя будет в таблице несколько записей "Вася | программист". Как поступить в этом случае? Проигнорировать дубли?
А если в одной строке имеем "Вася | программист", в другой "Вася | кодер", в третьей "Вася | админ", то собирать все эти значения? В каком порядке? В алфавитном или как они в таблице встречались?

И последний вопрос - а не трудно ли приложить к следующему сообщению книгу с образцами тестовых данных? (А то ведь так лень их выдумывать...)
Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне

584

Спасибо за теплый прием )

В моей задаче все имена (Вася, Коля), по которым происходит сравнение, уникальны. Если встретиться несколько одинаковых (Вася-програмист, Вася-сварщик), то их повторы можно игнорировать.
В реальности речь не об именах, а о названиях товаров, по котором происходит их идентификация, так что вопрос дублирования не стоит.

Прилагаю файл, там две таблицы, в них - товары с двух сайтов одной компании. В каждой таблице - товары интернет-магазина (Title) и их адреса (URL). Нам нужно сделать сводную таблицу, в которой будет видно какие товары повторяются на обоих сайтах, какие - нет. При этом видеть какие адреса у товаров на каждом из сайтов.

JohnSUN

Если я правильно понял, то хочется получить перечень возможных способов (алгоритмов действий, пошаговых инструкций) для вот такого результата?
Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне

584

Хотя бы один способ. Просто сейчас это делается вручную. Мне кажется задача условно стандартная и есть какой-то готовый способ.

Если таких способов несколько, то интересует какой-то, не требующий программирования, ниболее простой и запомниаемый.

JohnSUN

#5
Ну, запомнить будет не сложно, когда разберёмся, что именно делаем.
Делим общую задачу на два куска:
1. Получить общий список всех уникальных, не повторяющихся значений из первых колонок обеих (в общем случае - всех доступных) таблиц;
2. Дополнить получившуюся колонку значениями из второй колонки каждой таблицы (создать вторую-третью-и так далее колонки таблицы-результата)

Первый кусок выполняется просто.
Вариант 1. Обычным Скопировать-Вставить переносим значения каждой таблицы в новый лист, размещая их один под другим, одной колонкой - а затем удаляем дубликаты. От дублей проще всего избавиться, если натравить на получившийся список стандартный фильтр (см. картинку).
Вариант 2. Получаем такой объединённый список с помощью встроенного механизма Calc "Консолидация данных" - меню Данные - Объединить (в этом случае список сразу будет без дублей). Нужно будет совсем немного потренироваться, чтобы понять где и чего там нажимать, чтобы получить правильный результат (см. картинку)

Есть и другие, более навороченные варианты. Например, с помощью сложных формул или переносом таблиц в базу данных и выполнение запроса, который сразу вернёт нужный результат. Правда-правда, запрос вида
SELECT "FullList"."Title", "Таблица1"."URL" AS "URL1", "Таблица2"."URL" AS "URL2"
  FROM ( SELECT DISTINCT "Title" FROM ( SELECT "Title" FROM "Таблица1" UNION SELECT "Title" FROM "Таблица2" ) ) "FullList"
     LEFT OUTER JOIN "Таблица1" ON "FullList"."Title" = "Таблица1"."Title"
     LEFT OUTER JOIN "Таблица2" ON "FullList"."Title" = "Таблица2"."Title"
сразу дает ту же самую таблицу, что и в моём примере результата. Но это же придётся осваивать ещё и SQL и кучу смежных областей.
Поэтому работаем только с простыми вариантами с использованием исключительно Calc'а

Для второго куска проще всего использовать формулы.
Суть формулы очень проста - "найди в такой-то колонке вот это значение и верни значение из какой-то соседней ячейки (рядом или чуть дальше по строке)"
Обычно это делают с помощью функции VLOOKUP() (в русскоязычном варианте формул - ВПР())
Итак, в нашем новом листе с общим списком из колонок "Title" в ячейках B1 и C1 пишем заголовки колонок (например, URL1 и URL2), а в следующей строке вписываем формулы
=VLOOKUP(A2;Sheet1.$A:$B;2;0) в ячейку B2
=VLOOKUP(A2;Sheet2.$A:$B;2;0) в ячейку C2
Выделяем эти две ячейки, нажимаем Ctrl+Shift+End, чтобы растянуть выделение до конца имеющихся данных, и нажимаем Ctrl+D, чтобы заполнить формулами весь выделенный диапазон.
Возможно, нужно будет подождать результата - если данных в таблицах много, Calc может задуматься надолго.
В принципе, задача уже решена. Но есть небольшие огрехи - часть ячеек вместо ссылок содержит некрасивую запись #N/A (значение не было найдено). От этого можно избавиться несколькими способами.
Например, скопировать выделенный диапазон (у нас же до сих пор выделены колонки B и C со второй строки и до конца таблицы) и вставить на то же самое место с помощью специальной вставки Ctrl+Shift+V только значения (заменить формулы их результатом). Теперь обычным Найти и Заменить можем удалить строку#N/A из таблицы, очистить эти ячейки.
Другой способ - немного усложнить первоначальную формулу, "обернуть" функцию VLOOKUP в ещё одну функцию IFERROR
=IFERROR(VLOOKUP(A2;Sheet1.$A:$B;2;0);"") в ячейке B2
=IFERROR(VLOOKUP(A2;Sheet2.$A:$B;2;0);"") в ячейке C2


Вместо VLOOKUP можно использовать комбинацию функций INDEX() и MATCH() - IT-специалисты настаивают на том, что хотя такая запись и кажется более сложной, но работает лучше.
=IFERROR(INDEX(Sheet1.$B:$B;MATCH(A2;Sheet1.$A:$A;0));"")
или чтобы проще было запомнить
=IFERROR(INDEX(<из какой колонки брать значение>;MATCH(<что искать>;<в какой колонке искать>;0));"")

Ну, и последняя рекомендация: запись диапазона вида $A:$A или $A:$B проста и удобна. Но если Calc слишком долго мучается с вычислениями, лучше облегчить ему задачу и указывать реальные диапазоны для поиска, с номерами строк - в нашем случае что-то вроде Sheet2.$A$2:B$17

Возникнут вопросы - не стесняйся, мы всегда где-то здесь, постараемся помочь.
Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне

584

Спасибо огромное! Просто супер!

batara

#7
Цитата: JohnSUN от 30 августа 2018, 13:06

Возникнут вопросы - не стесняйся, мы всегда где-то здесь, постараемся помочь.

Добрый день. Несколько дней вчитываюсь, пробую - не получается обьеденить таблицы. Работаю в OpenOffice. Помогите, пожалуйста понять принцип обьединения нескольких таблиц. (1 таблица описание товара, 2 - цена, 3 - ссылка на картинки)

нужно всю таблицу на одном листе держать или каждой свой лист? Понимаю, что Вы все детально рассписали но никак не могу понять - как пользоваться функцией обьединения. Благодарю Сейчас прикреплю мой файл, покажу.

bigor

Цитата: batara от 11 ноября 2019, 11:18как пользоваться функцией обьединения
Добавить формулы впр/vlookup. Для вашего примера в W1
=VLOOKUP(A1;$A$6:$B$7;2) и протянуть вниз
для X1 =VLOOKUP(A1;$A$10:$B$11;2) и протянуть вниз

Если таблицы будут на разных листах, то подправить адреса диапазонов.
Ну и тюнинг можно добавить по обработке ошибок :) У JohnSUN выше все расписано
Поддержать разработчиков LibreOffice можно можно тут, а наш форум вот тут