Использование сопоставления как альтернативы соединению
Префикс Join в программе QlikView (Qlik Sense) является мощным инструментом для объединения нескольких таблиц данных в модель данных. Единственным недостатком является то, что объединенные таблицы могут оказаться большими, из-за чего могут возникнуть проблемы при выполнении. Альтернативой соединению Join в ситуациях, когда необходимо найти одиночное значение в другой таблице, является сопоставление. В этом случае не будут загружены ненужные данные, которые могли бы замедлить вычисления и создать ошибки при вычислениях, поскольку при соединении может измениться число записей в таблицах.
Таблица сопоставления состоит из двух столбцов: поле сравнения (входные данные) и поле со значением сопоставления (выходные данные).
В этом примере у нас есть таблица с заказами (Orders). Нам необходимо узнать страну клиента, который указан в таблице клиентов (Customers).
OrderID | OrderDate | ShipperID | Freight | CustomerID |
12987 | 2007–12–01 | 1 | 27 | 3 |
12988 | 2007–12–01 | 1 | 65 | 4 |
12989 | 2007–12–02 | 2 | 32 | 2 |
12990 | 2007–12–03 | 1 | 76 | 3 |
CustomerID | Name | Country | … |
1 | DataSales | Spain | … |
2 | BusinessCorp | Italy | … |
3 | TechCo | Germany | … |
4 | Mobecho | France | … |
Чтобы найти страну (Country) клиента, нам нужна таблица сопоставления, которая выглядит следующим образом:
CustomerID | Country |
1 | Spain |
2 | Italy |
3 | Germany |
4 | France |
Таблица сопоставления, которую мы назвали MapCustomerIDtoCountry, определена в скрипте следующим образом:
Mapping LOAD CustomerID, Country From Customers ;
Далее мы применим сопоставление с помощью функции ApplyMap при загрузке таблицы с заказами:
S *,
ApplyMap('MapCustomerIDtoCountry', CustomerID, null()) as Country
From Orders ;
Третий параметр функции ApplyMap используется, чтобы определить, какие значения вернуть. Если значение в таблице сопоставления не найдено, возвращается значение Null().
Результирующая таблица будет выглядеть так:
OrderID | OrderDate | ShipperID | Freight | CustomerID | Country |
12987 | 2007–12–01 | 1 | 27 | 3 | Germany |
12988 | 2007–12–01 | 1 | 65 | 4 | France |
12989 | 2007–12–02 | 2 | 32 | 2 | Italy |
12990 | 2007–12–03 | 1 | 76 | 3 | Germany |
ApplyMap — функция скрипта
Функция скрипта ApplyMap в QlikView (Qlik Sense) используется для сопоставления результата выражения с ранее загруженной таблицей сопоставления.
expression [
, default_mapping ] )
Тип возвращаемого значения: dual
Аргументы:
Аргумент | Описание |
---|---|
map_name | Имя таблицы сопоставления, созданной ранее с помощью операторов mapping load или mapping select. Имя таблицы должно быть заключено в одинарные прямые кавычки. |
expression | Выражение, результат которого должен быть сопоставлен. |
default_mapping |
Если это значение задано, оно будет использовано как значение по умолчанию, если таблица сопоставления не содержит совпадающего значения для параметра expression. Если значение не задано, то значение параметра expression выводится как есть. |
Пример:
В этом примере мы загружаем список продавцов с кодом страны, представляющим их страну проживания. Мы используем таблицу, соответствующую коду страны, для той страны, код которой будет заменен ее названием. В таблице сопоставления указаны только три страны, коды других стран указаны в параметре 'Rest of the world'.
mapping LOAD *
Inline [
CCode, Country
Sw, Sweden
Dk, Denmark
No, Norway
] ;
Salespersons:
LOAD *,
ApplyMap('map1', CCode,'Rest of the world') As Country
Inline [
CCode, Salesperson
Sw, John
Sw, Mary
Sw, Per
Dk, Preben
Dk, Olle
No, Ole
Sf, Risttu] ;
Drop Field 'CCode';
Полученная таблица выглядит следующим образом:
Salesperson | Country |
---|---|
John | Sweden |
Mary | Sweden |
Per | Sweden |
Preben | Denmark |
Olle | Denmark |
Ole | Norway |
Risttu | Rest of the world |
Mapping
Префикс mapping в QlikView (Qlik Sense) используется для создания таблицы сопоставления, которую можно использовать, например, для замены значений полей и имен полей в ходе выполнения скрипта.
Синтаксис:
Mapping( loadstatement | selectstatement )
Префикс mapping можно поставить перед оператором LOAD или SELECT. Он будет сохранять результат оператора загрузки в качестве таблицы сопоставления. Mapping — эффективный способ замены значений полей во время выполнения скрипта, например замены значений «СШ», «С.Ш.» или «Америка» значением «США». Таблица сопоставления состоит из двух столбцов, первый из которых содержит значения, используемые для сравнения, а второй — желаемые значения для сопоставления. Таблицы сопоставления временно хранятся в памяти и автоматически удаляются после выполнения скрипта.
К содержанию таблицы сопоставления доступ осуществляется с помощью, например, оператора Map … Using, Rename Field, функции Applymap() или Mapsubstring().
Пример:
В этом примере мы загружаем список продавцов с кодом страны, представляющим их страну проживания. Мы используем таблицу, соответствующую коду страны, для той страны, код которой будет заменен ее названием. В таблице сопоставления указаны только три страны, коды других стран указаны в параметре 'Rest of the world'.
map1:
mapping LOAD *
Inline [
CCode, Country
Sw, Sweden
Dk, Denmark
No, Norway
] ;
// Load list of salesmen, mapping country code to country
Salespersons:
LOAD *,
ApplyMap('map1', CCode,'Rest of the world') As Country
Inline [
CCode, Salesperson
Sw, John
Sw, Mary
Sw, Per
Dk, Preben
Dk, Olle
No, Ole
Sf, Risttu] ;
// We don't need the CCode anymore
Drop Field 'CCode';
Полученная таблица выглядит следующим образом:
Salesperson | Country |
---|---|
John | Sweden |
Mary | Sweden |
Per | Sweden |
Preben | Denmark |
Olle | Denmark |
Ole | Norway |
Risttu | Rest of the world |
Unmap
Оператор Unmap в QlikView (Qlik Sense) деактивирует значение поля mapping, заданное предыдущим оператором Map … Using для последующих загружаемых полей.
Синтаксис:
Unmap *fieldlist
Аргументы:
Аргумент | Описание |
---|---|
*fieldlist | разделенный запятыми список полей, которые не нужно больше сопоставлять, начиная с этой точки выполнения скрипта. Символ * в качестве списка полей обозначает все поля. В именах полей разрешается использовать знаки подстановки * и ?. При использовании знаков подстановки, возможно, понадобится заключать имена полей в кавычки. |
Примеры и результаты:
Пример | Результат |
---|---|
Unmap Country; | Отключает сопоставление поля Country. |
Unmap A, B, C; | Отключает сопоставление полей A, B и C. |
Unmap * ; | Отключает сопоставление всех полей. |
Map
Оператор map … using в QlikView (Qlik Sense) используется для сопоставления определенных значений полей или выражений со значениями в определенной таблице сопоставления. Таблицу сопоставления можно создать с помощью оператора mapping.
Автоматическое сопоставление выполняется для полей, загруженных после выполнения оператора Map … Using вплоть до конца выполнения скрипта или появления оператора Unmap.
Сопоставление в цепочке событий, заканчивающейся сохранением поля во внутренней таблице QlikView (Qlik Sense), выполняется в последнюю очередь. Таким образом, сопоставление выполняется не при каждом появлении имени поля в выражении, а тогда, когда значение сохранено во внутренней таблице под определенным именем поля. Если необходимо выполнить сопоставление на уровне выражения, используйте функцию Applymap().
Аргументы:
Аргумент | Описание |
---|---|
*fieldlist | Разделенный запятыми список полей, которые следует сопоставить, начиная с этой точки выполнения скрипта. Символ * в качестве списка полей обозначает все поля. В именах полей разрешается использовать знаки подстановки * и ?. При использовании знаков подстановки, возможно, понадобится заключать имена полей в кавычки. |
mapname | Имя таблицы сопоставления, считанной ранее в операторе mapping load или mapping select. |
Примеры и результаты:
Пример | Результат |
---|---|
Map Country Using Cmap; | Позволяет выполнять сопоставление поля Country с помощью карты Cmap. |
Map A, B, C Using X; | Позволяет выполнять сопоставление полей A, B и C с помощью карты X. |
Map * Using GenMap; | Позволяет сопоставлять все поля с помощью элемента GenMap. |
Свяжитесь с нами
Более подробную информацию Вы можете получить, позвонив в "ФБ Консалт" по тел.: +7 (495) 781–6400 или отправив запрос по электронной почте: info@fbconsult.ru. Специалисты компании с радостью ответят на все интересующие Вас вопросы. Обращайтесь!