Объединение данных с помощью CONCATENATE

Апр 3, 2021 Qlik

CONCATENATE — это объединение двух таблиц. В отличие от присоединения, где вторая таблица добавляется сбоку, объединение добавляет вторую таблицу снизу. При этом, как и в случае присоединения, результирующая таблица содержит полный набор полей из обеих таблиц. Объединение очень похоже на операцию SQL UNION с небольшими отличиями — префикс CONCATENATE может быть использован даже если набор полей в двух таблицах разный и полностью идентичные записи не удаляются из результата операции.

Если две таблицы содержат поля с одинаковыми именами, объединение выполняется автоматически. И такое автоматическое объединение частый источник ошибок у новичков. Эта важная деталь, о которой необходимо помнить.

Синтаксис CONCATENATE выглядит следующим образом:

Concatenate [ (tablename ) ] ( loadstatement | selectstatement )

Продемонстрируем работу префикса CONCATENATE на примере — пусть у нас есть две таблицы Продажи и Поставки и мы ходим объединить их в одну таблицу. Таблица Продажи выглядит следующим образом:

ДатаВремяТоварКоличествоСумма
01.01.202014:32:00Гвоздь5005000
02.01.202010:30:00Шуруп20250
05.01.202016:51:00Винт3004500
07.01.202013:47:00Гайка50650
01.01.202010:43:00Гвоздь5005000
02.01.202011:43:00Винт3004500
05.01.202012:43:00Гайка50650

Таблица Поставки в свою очередь выглядит так:

ДатаТоварКоличествоПоставщик
01.01.2020Гвоздь1000ООО «Железная тема»
01.01.2020Шуруп50ООО «Железная тема»
02.01.2020Винт1000АО «Метализделие»
03.01.2020Гайка100ИП Иванов

Скрипт загрузки данных и использования CONCATENATE выглядит следующим образом:

ДвижениеТоваров:
LOAD * INLINE [
Дата Время Товар Количество Сумма
01.01.2020 14:32:00 Гвоздь 500 5000
02.01.2020 10:30:00 Шуруп 20 250
05.01.2020 16:51:00 Винт 300 4500
07.01.2020 13:47:00 Гайка 50 650
01.01.2020 10:43:00 Гвоздь 500 5000
02.01.2020 11:43:00 Винт 300 4500
05.01.2020 12:43:00 Гайка 50 650
] (delimiter is spaces);

CONCATENATE(ДвижениеТоваров)
LOAD * INLINE [
Дата Товар Количество Поставщик
01.01.2020 Гвоздь 1000 ‘ООО «Железная тема»‘
01.01.2020 Шуруп 50 ‘ООО «Железная тема»‘
02.01.2020 Винт 1000 ‘АО «Метализделие»‘
03.01.2020 Гайка 100 ‘ИП Иванов’
] (delimiter is spaces);

В скрипте данные обеих таблиц загружаются в одну таблицу с названием ДвижениеТоваров. Порядок загрузки таблиц не важен. Результирующая таблица будет выглядеть следующим образом:

ДатаВремяТоварКоличествоСуммаПоставщик
02.01.202010:30:00Шуруп20250
01.01.202010:43:00Гвоздь5005000
02.01.202011:43:00Винт3004500
05.01.202012:43:00Гайка50650
07.01.202013:47:00Гайка50650
01.01.202014:32:00Гвоздь5005000
05.01.202016:51:00Винт3004500
01.01.2020Гвоздь1000ООО «Железная тема»
01.01.2020Шуруп50ООО «Железная тема»
02.01.2020Винт1000АО «Метализделие»
03.01.2020Гайка100ИП Иванов

Обратите внимание на то, что в данных таблицы Поставки отсутствовали сведения в полях Время и Сумма поскольку таких столбцов просто не было в таблице Поставки, поэтому в результирующей таблице в строках из таблицы Поставки поля Время и Сумма заполнены пустыми значениями (NULL значениями).

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

CONCATENATE or NOCONCATENATE

Как уже было отмечено в начале статьи, в случаях когда обе таблицы содержат полностью идентичные наименования полей, происходит автоматическое объединение результатом которого является одна таблица. Проще всего это представить на следующем примере — загрузим таблицу Продажи, а затем загрузим из нее данные в другую таблицу Продажи2:

Продажи:
LOAD * INLINE [
Дата Время Товар Количество Сумма
01.01.2020 14:32:00 Гвоздь 500 5000
02.01.2020 10:30:00 Шуруп 20 250
05.01.2020 16:51:00 Винт 300 4500
07.01.2020 13:47:00 Гайка 50 650
01.01.2020 10:43:00 Гвоздь 500 5000
02.01.2020 11:43:00 Винт 300 4500
05.01.2020 12:43:00 Гайка 50 650
] (delimiter is spaces);

Продажи2:
LOAD * RESIDENT Продажи;

Результатом выполнения скрипта будет не две таблицы, а одна. Таблица Продажи2 даже не будет создана — все строки таблицы Продажи загрузятся в нее же. Такая ошибка очень распространена у новичков. Чтобы избежать автоматического объединения двух таблиц используется префикс NOCONCATENATE. Префикс указывается перед оператором LOAD который может вызвать автоматическое объединение таблицы и результатов указанного ниже LOAD или SELECT запроса:

Продажи:
LOAD * INLINE [
Дата Время Товар Количество Сумма
01.01.2020 14:32:00 Гвоздь 500 5000
02.01.2020 10:30:00 Шуруп 20 250
05.01.2020 16:51:00 Винт 300 4500
07.01.2020 13:47:00 Гайка 50 650
01.01.2020 10:43:00 Гвоздь 500 5000
02.01.2020 11:43:00 Винт 300 4500
05.01.2020 12:43:00 Гайка 50 650
] (delimiter is spaces);

Продажи2:
NOCONCATENATE LOAD * RESIDENT Продажи;

Такой скрипт уже создаст две таблицы Продажи и Продажи2.