# Примеры пользовательского SQL для Direct Query

В следующих примерах показаны некоторые варианты использования пользовательского SQL для Direct Query.

## Пример: добавление определений пользовательского SQL в модель Direct Query

В этом примере определения пользовательского SQL для таблиц C, R, N добавляются в модель данных в приложении Direct Query вместе с двумя межтабличными связями. Функция Coalesce используется для проверки того, равно ли значение поля N\_NATIONKEY значению C\_NATIONKEY или оба они равны значению null.

Примечание к подсказке

Coalesce — это рекомендуемый способ добавления проверки того, равно ли значение поля значению null. Для получения дополнительной информации см. [coalesceФункция скрипта и диаграммы](https://help.qlik.com/ru-RU/cloud-services/Subsystems/Hub/Content/Sense_Hub/Scripting/ConditionalFunctions/coalesce.htm).

```

LIB CONNECT TO 'CustomSQL:Snowflake_example.com';
Section DirectQuery;
			
C:
Select C_NATIONKEY, Sum(C_ACCTBAL) as C_SUM from tpch1.customer group by C_NATIONKEY;
			
R:
SELECT R_REGIONKEY, R_NAME from tpch1.region;
			
N:
SELECT N_REGIONKEY, N_NAME, N_NATIONKEY from tpch1.nation;
			
Create Relationship Between R, N Matching R_REGIONKEY With N_REGIONKEY;
Create Relationship
	Between Outer Joined N, Inner Joined C On
	(coalesce([N_NATIONKEY], -1) = coalesce([C_NATIONKEY], -1));
```

## Пример: добавление таблиц с пользовательским SQL в модель данных, созданную с помощью Диспетчер модели данных

В этом примере модель данных Direct Query сначала создается с содержимым объекта DirectQueryModel.main, который был создан с помощью Диспетчер модели данных. Затем в модель данных добавляется дополнительная таблица C с полями C\_CUSTKEY и C\_ACCTBAL. Устанавливается связь между полем O\_CUSTKEY в ORDERS и полем C\_CUSTKEY в C.

```
LIB CONNECT TO 'CustomSQL:Snowflake_example.com';
			
// DMM created model portion includes Orders table.

IMPORT LIVE 'ModelName@obj://DirectQueryModel.Main';

Section DirectQuery;

C: Select C_CUSTKEY, C_ACCTBAL from tpch1.customer;
Create Relationship Between ORDERS, C on (O_CUSTKEY = C_CUSTKEY); 
```

## Пример: создание модели данных Direct Query с таблицей пользовательского SQL

В этом примере модель данных Direct Query создается с таблицей пользовательского SQL C с переименованными полями C\_KEY и C\_BAL. Затем IMPORT LIVE добавляет модель данных, созданную в Диспетчер модели данных из DirectQueryModel.main. Эта модель данных содержит таблицу Orders и имеет существующую связь между Orders and Customer в этой модели. Затем существующая связь между Customers и Orders удаляется, и определяется новая связь между Orders и C.

```
LIB CONNECT TO 'CustomSQL:Snowflake_example.com';
			
Section DirectQuery;
			
C: Select C_CUSTKEY as C_KEY, C_ACCTBAL as C_BAL from tpch1.customer;
			
// DMM created model portion includes Orders table.
			
IMPORT LIVE 'ModelName@obj://DirectQueryModel.Main';
			
// This relationship was defined using DMM between ORDERS and CUSTOMER, but I want to define my own.
			
Drop Relationship Between ORDERS, CUSTOMER;
Create Relationship Between ORDERS, C on (O_CUSTKEY = C_KEY);
```

## Пример: создание модели данных, включающей переменные

В этом примере сначала определяется переменная MULT со значением 100. Затем она применяется в качестве множителя к сумме PS\_Supplycost для вычисления поля S.

LIB CONNECT TO 'CustomSQL:Snowflake\_example.com'; Section DirectQuery; LET MULT=100; T1: SELECT PS\_AVAILQTY AS C, SUM(PS\_SUPPLYCOST) \* $(MULT) AS S FROM "TPCH.01"."PARTSUPP" GROUP BY C;

## Пример: создание модели данных с выражениями Qlik

В этом примере для построения модели данных используются как переменные, так и выражения. В таблице ORDERS\_AGGREGATIONS выражения используются для определения значений в ORDERS\_GROUP\_TOTAL\_PRICE. При каждом совершении выборки на листе, которая влияет на значения в ORDERS\_GROUP\_TOTAL\_PRICE, выражение будет вычисляться повторно на основе данных, возвращенных запросом к базе данных.

IMPORT LIVE 'ModelName@obj://DirectQueryModel.Main'; section DirectQuery; let Aggr1 = 1; let Aggr2 = 0; [GROUPS]: SELECT 0 as GROUP\_CODE, 'NONE' as "GROUP" UNION ALL SELECT 1 as GROUP\_CODE, 'ORDERSTATUS' as "GROUP" UNION ALL SELECT 2 as GROUP\_CODE, 'ORDERPRIORITY' as "GROUP" ; [ORDERS\_AGGREGATIONS]: SELECT 'BY ORDERSTATUS' as "GROUP\_NAME", "O\_ORDERSTATUS" as "ORDERS\_GROUP", sum("O\_TOTALPRICE") as "ORDERS\_GROUP\_TOTAL\_PRICE" FROM "TEST1"."TPCH.01"."ORDERS" WHERE '$(=min({&lt;GROUP\_CODE={0,1}&gt;}[GROUP\_CODE]))' = '1' GROUP BY 1,2 UNION ALL SELECT 'BY ORDERPRIORITY' as "GROUP\_NAME", "O\_ORDERPRIORITY" as "ORDERS\_GROUP", sum("O\_TOTALPRICE") as "ORDERS\_GROUP\_TOTAL\_PRICE" FROM "TEST1"."TPCH.01"."ORDERS" WHERE '$(=min({&lt;GROUP\_CODE={0,2}&gt;}[GROUP\_CODE]))' = '2' GROUP BY 1,2; ; [ORDERS\_AGGREGATIONS\_VARS]: SELECT 'BY ORDERSTATUS' as "GROUP\_NAME\_V", "O\_ORDERSTATUS" as "ORDERS\_GROUP\_V", sum("O\_TOTALPRICE") as "ORDERS\_GROUP\_TOTAL\_PRICE\_V" FROM "TEST1"."TPCH.01"."ORDERS" WHERE $(=Aggr1) = 1 GROUP BY 1,2 UNION ALL SELECT 'BY ORDERPRIORITY' as "GROUP\_NAME\_V", "O\_ORDERPRIORITY" as "ORDERS\_GROUP\_V", sum("O\_TOTALPRICE") as "ORDERS\_GROUP\_TOTAL\_PRICE\_V" FROM "TEST1"."TPCH.01"."ORDERS" WHERE $(=Aggr2) = 1 GROUP BY 1,2; ;

## Пример: использование функций в пользовательских выражениях SQL

Следующая пользовательская инструкция SQL демонстрирует простое использование выражения движка $(=…), которое расширяется при выполнении в пользовательском SQL. Это выражение извлекает строки удаленной базы данных в зависимости от информации о пользователе сеанса приложения. Когда диаграмма, запрос или выборка выполняются пользователем сеанса приложения Direct Query с адресом электронной почты 'user1@qlik.com', динамическое извлечение строк данных из удаленной базы данных SQL фильтруется так, чтобы соответствовать только тем строкам, в которых поле C\_NAME содержит значение 'Customer#000000007'. В противном случае, если адрес электронной почты пользователя сеанса приложения Direct Query не равен 'user1@qlik.com', будут извлечены и показаны только те строки, в которых поле C\_NAME содержит значение 'Customer#000000009'.

T8: SELECT \* FROM mydb.tpch01.customer WHERE mydb.tpch01.customer.C\_NAME = '$(=if(GetUserAttr('userEmail') = 'user1@qlik.com', 'Customer#000000007','Customer#000000009'))';