Форум поддержки пользователей. LibreOffice, Apache OpenOffice, OpenOffice.org

Форум поддержки пользователей. LibreOffice, Apache OpenOffice, OpenOffice.org

20 Сентябрь 2018, 17:42 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
Новости: Вы можете задать вопрос по LibreOffice или Apache OpenOffice  без регистрации, используя форму
 
   Начало   Помощь Поиск Войти Регистрация    задать вопрос  
Страниц: 1   Вниз
  Печать  
Автор Тема: Как объединить таблицы?  (Прочитано 420 раз)
0 Пользователей и 1 Гость смотрят эту тему.
584
Новичок
*
Offline Offline

Сообщений: 4


« Стартовое сообщение: 29 Август 2018, 21:05 »

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

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

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

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

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

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

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

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

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

Пол: Мужской
Расположение: Киев
Сообщений: 2 576


Помогаю людям и компьютерам понимать друг друга


WWW
« Ответ #1: 29 Август 2018, 21:39 »

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

И последний вопрос - а не трудно ли приложить к следующему сообщению книгу с образцами тестовых данных? (А то ведь так лень их выдумывать...)
Записан

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

Сообщений: 4


« Ответ #2: 30 Август 2018, 00:25 »

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

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

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

* Primer.ods (20.67 Кб - загружено 3 раз.)
Записан
JohnSUN
Капитана в тот день называли на "ты"
Гуру
*******
Offline Offline

Пол: Мужской
Расположение: Киев
Сообщений: 2 576


Помогаю людям и компьютерам понимать друг друга


WWW
« Ответ #3: 30 Август 2018, 08:02 »

Если я правильно понял, то хочется получить перечень возможных способов (алгоритмов действий, пошаговых инструкций) для вот такого результата?

* Два сайта (ожидаемый результат).ods (9.99 Кб - загружено 4 раз.)
Записан

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

Сообщений: 4


« Ответ #4: 30 Август 2018, 11:26 »

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

Если таких способов несколько, то интересует какой-то, не требующий программирования, ниболее простой и запомниаемый.
Записан
JohnSUN
Капитана в тот день называли на "ты"
Гуру
*******
Offline Offline

Пол: Мужской
Расположение: Киев
Сообщений: 2 576


Помогаю людям и компьютерам понимать друг друга


WWW
« Ответ #5: 30 Август 2018, 13:06 »

Ну, запомнить будет не сложно, когда разберёмся, что именно делаем.
Делим общую задачу на два куска:
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

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


* Дубли долой.png (16.16 Кб, 466x382 - просмотрено 6 раз.)

* Консолидация.png (16.75 Кб, 506x504 - просмотрено 6 раз.)
« Последнее редактирование: 30 Август 2018, 13:09 от JohnSUN » Записан

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

Сообщений: 4


« Ответ #6: 30 Август 2018, 13:41 »

Спасибо огромное! Просто супер!
Записан
Страниц: 1   Вверх
  Печать  
 
Перейти в:  

Powered by MySQL Powered by PHP Powered by SMF 1.1.21 | SMF © 2006-2009, Simple Machines Valid XHTML 1.0! Valid CSS!