# Direct Query のカスタム SQL の例

次の例は、Direct Query にカスタム SQL を使用する場合のオプションの一部を示しています。

## 例: カスタム SQL 定義を Direct Query モデルに追加する

この例では、テーブル C、R、N のカスタム SQL 定義が 2 つのテーブル間のリレーションシップとともに Direct Query アプリケーションのデータ モデルに追加されています。Coalesce 関数は、N\_NATIONKEY の項目値が C\_NATIONKEY の値と等しいかどうか、または両方が null に等しいかどうかをチェックするために使用されます。

ヒント メモ

Coalesce は、項目値が null に等しいかどうかのチェックを含める場合に推奨される方法です。詳細については、「[coalesceスクリプトおよびチャート関数](https://help.qlik.com/ja-JP/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\_CUSTKEY および C\_ACCTBAL を持つ追加のテーブル C がデータ モデルに追加されます。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 データ モデルは、名前が変更された項目 C\_KEY および C\_BAL を持つ、カスタム SQL テーブル C で構築されています。次に、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 で実行されたときに展開される $(=…) Engine 式の簡単な使用法を示しています。この式は、アプリケーション セッションのユーザー情報に応じてリモート データベースの行を取得します。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'))';