# Exemplos de SQL personalizado para o Direct Query

Os exemplos a seguir mostram algumas das opções ao usar SQL personalizado para o Direct Query.

## Exemplo: adicionando definições de SQL personalizado no modelo do Direct Query

Neste exemplo, definições de SQL personalizado para tabelas C, R, N são adicionadas ao modelo de dados no aplicativo Direct Query junto com dois relacionamentos entre tabelas. A função Coalesce é utilizada para verificar se o valor de um campo de N\_NATIONKEY é igual ao valor de C\_NATIONKEY, ou se ambos são iguais a nulo.

Nota de dica

Coalesce é a maneira recomendada de incluir uma verificação para ver se o valor de um campo é igual a nulo. Para obter mais informações, consulte [coalesceFunção de script e de gráfico](https://help.qlik.com/pt-BR/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));
```

## Exemplo: adicionando tabelas com SQL personalizado a um modelo de dados feito com o Gerenciador do modelo de dados

Neste exemplo, o modelo de dados do Direct Query é construído primeiro com o conteúdo do objeto DirectQueryModel.main, que foi criado com o Gerenciador do modelo de dados. Em seguida, uma tabela adicional, C com os campos C\_CUSTKEY e C\_ACCTBAL, é adicionada ao modelo de dados. É feito um relacionamento entre o campo O\_CUSTKEY no ORDERS com o campo C\_CUSTKEY no 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); 
```

## Exemplo: construindo um modelo de dados do Direct Query com uma tabela de SQL personalizado

Neste exemplo, o modelo de dados do Direct Query é construído com uma tabela de SQL personalizado, C, com os campos renomeados C\_KEY e C\_BAL. Em seguida, o IMPORT LIVE adiciona o modelo de dados criado no Gerenciador do modelo de dados a partir de DirectQueryModel.main. Este modelo de dados contém a tabela Pedidos e possui um relacionamento existente entre Orders e Customer e nesse modelo. Então, o relacionamento existente entre Customers e Orders é eliminado e um novo relacionamento é definido entre Orders e 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);
```

## Exemplo: construindo um modelo de dados incluindo variáveis

Neste exemplo, a variável MULT é definida primeiro com um valor de 100. Em seguida, é aplicado como multiplicador à soma de PS\_Supplycost para calcular o campo 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;

## Exemplo: construindo um modelo de dados com expressões Qlik

Neste exemplo, tanto variáveis quanto expressões são usadas para construir o modelo de dados. Na tabela ORDERS\_AGGREGATIONS, são usadas expressões para definir os valores em ORDERS\_GROUP\_TOTAL\_PRICE. Sempre que forem feitas seleções em uma pasta que possam impactar os valores em ORDERS\_GROUP\_TOTAL\_PRICE, a expressão será reavaliada nos dados retornados pela consulta ao banco de dados.

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

## Exemplo: Usando funções em expressões SQL personalizadas

A seguinte instrução SQL personalizada demonstra um uso simples de uma expressão do mecanismo $(=…) que é expandida quando executada no SQL personalizado. Essa expressão recupera linhas de banco de dados remoto dependendo das informações do usuário da sessão do aplicativo. Quando um gráfico, consulta ou seleção é executado por um usuário da sessão do aplicativo Direct Query com o endereço de e-mail 'user1@qlik.com', a recuperação dinâmica de linhas de dados do banco de dados SQL remoto é filtrada para corresponder apenas às linhas onde o campo C\_NAME contém o valor 'Customer#000000007'. Caso contrário, se o e-mail do usuário da sessão do aplicativo Direct Query não for 'user1@qlik.com', apenas as linhas onde o campo C\_NAME contém o valor 'Customer#000000009' serão recuperadas e exibidas.

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