# 針對 Direct Query 的自訂 SQL 範例

以下範例顯示針對 Direct Query 使用自訂 SQL 時的部分選項。

## 範例：將自訂 SQL 定義新增至 Direct Query 模型

在此範例中，資料表 C、R、N 的自訂 SQL 定義會與兩個資料表間關係一起新增至 Direct Query 應用程式中的資料模型。使用 Coalesce 函數可用於檢查 N\_NATIONKEY 的欄位值是否等於 C\_NATIONKEY 的值，或者兩者是否皆等於 null。

提示備註

Coalesce 是包含檢查以查看欄位值是否等於 null 的建議方法。如需詳細資訊，請參閱 [coalesce指令碼與圖表函數](https://help.qlik.com/zh-TW/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 資料模型

在此範例中，Direct Query 資料模型是使用自訂 SQL 資料表 C 建構，其中包含重新命名的欄位 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);
```

## 範例：建構包含變數的資料模型

在此範例中，首先定義值為 100 的變數 MULT。然後，將其作為乘數套用至 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 欄位包含值 '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'))';