# Direct Query 的自定义 SQL 示例

以下示例显示了为 Direct Query 使用自定义 SQL 时的某些选项。

## 示例：向 Direct Query 模型添加自定义 SQL 定义

在此示例中，表 C、R、N 的自定义 SQL 定义与两个表间关系一起添加到 Direct Query 应用程序中的数据模型。使用 Coalesce 函数来检查 N\_NATIONKEY 的字段值是否等于 C\_NATIONKEY 的值，或者两者是否都等于 null。

提示注释

Coalesce 是包含检查以查看字段值是否等于 null 的推荐方法。有关详细信息，请参阅 [coalesce脚本和图表功能](https://help.qlik.com/zh-CN/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 的表

在此示例中，首先使用在 数据模型管理器 中创建的 DirectQueryModel.main 对象中的内容构建 Direct Query 数据模型。然后，将一个附加表 C（具有字段 C\_CUSTKEY 和 C\_ACCTBAL）添加到数据模型。在 ORDERS 中的字段 O\_CUSTKEY 与 C 中的字段 C\_CUSTKEY 之间建立关系。

```
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); 
```

## 示例：使用自定义 SQL 表构建 Direct Query 数据模型

在此示例中，使用自定义 SQL 表 C 构建 Direct Query 数据模型，其中重命名了字段 C\_KEY 和 C\_BAL。接下来，IMPORT LIVE 从 DirectQueryModel.main 添加在 数据模型管理器 中创建的数据模型。该数据模型包含表 Orders，并且在该模型中，Orders 和 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 中执行时会被展开。此表达式根据应用程序会话的用户信息检索远程数据库行。当具有电子邮件地址 'user1@qlik.com' 的 Direct Query 应用程序会话用户执行图表、查询或选择时，从远程 SQL 数据库动态检索数据行将被过滤，以仅匹配 C\_NAME field 包含值 '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'))';