# 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/ko-KR/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\_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에서 실행될 때 확장되는 $(=…) 엔진 표현식의 간단한 사용을 보여줍니다. 이 표현식은 응용 프로그램 세션의 사용자 정보에 따라 원격 데이터베이스 행을 검색합니다. 이메일 주소가 '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'))';