Esta página se refere ao parâmetro
sql
que faz parte de um campo.
sql
também pode ser usado como parte de uma tabela derivada, conforme descrito na página de documentação de parâmetrosql
(para tabelas derivadas).
Uso
dimension: field_name {
sql: ${revenue_in_dollars} - ${inventory_item.cost_in_dollars} ;;
}
}
Hierarquia
sql |
Tipos de campo possíveis
Dimensão, grupo de dimensões, filtro, medidaAceita
Uma expressão SQLRegras especiais
Uma expressão SQL que varia de acordo com o type do campo (veja mais detalhes abaixo)
|
Definição
O parâmetro sql
usa vários tipos de expressões SQL que vão definir uma dimensão, medida ou filtro. A expressão que você precisa escrever varia de acordo com o tipo de campo que está sendo criado. Veja mais detalhes sobre os tipos de filtro e dimensão na página de documentação Tipos de dimensões, filtros e parâmetros e mais detalhes na página de documentação Tipos de métricas. Consulte também a página de documentação Como incorporar o SQL e como se referir a objetos LookML.
sql
para dimensões
O bloco sql
para dimensões geralmente pode usar qualquer SQL válido que vá para uma única coluna de uma instrução SELECT
. Essas instruções geralmente dependem do operador de substituição do Looker, que tem várias formas:
${TABLE}.column_name
faz referência a uma coluna na tabela que está conectada à visualização em que você está trabalhando.${dimension_name}
faz referência a uma dimensão na visualização em que você está trabalhando.${view_name.dimension_name}
faz referência a uma dimensão de outra visualização.${view_name.SQL_TABLE_NAME}
faz referência a outra visualização ou tabela derivada. Observe queSQL_TABLE_NAME
nesta referência é uma string literal, você não precisa substituí-la por nada.
Se sql
não for especificado, o Looker entenderá que há uma coluna na tabela com o mesmo nome do campo. Por exemplo, selecionar um campo chamado city
sem um parâmetro sql
seria equivalente a especificar sql: ${TABLE}.city
.
O parâmetro
sql
de uma dimensão não pode incluir agregações. Isso significa que não pode conter agregações de SQL ou referências a medidas LookML. Se você quiser criar um campo comsql
que inclua uma agregação de SQL ou que faça referência a uma medida LookML, use um parâmetrosql
em uma medida, não em uma dimensão.
Uma dimensão muito simples que usa o valor diretamente de uma coluna chamada revenue
pode ter esta aparência:
dimension: revenue_in_cents {
sql: ${TABLE}.revenue ;;
type: number
}
Uma dimensão que depende de outra dimensão na mesma visualização pode ter esta aparência:
dimension: revenue_in_dollars {
sql: ${revenue_in_cents} / 100 ;;
type: number
}
Uma dimensão que depende de outra dimensão em uma visualização diferente pode ter esta aparência:
dimension: profit_in_dollars {
sql: ${revenue_in_dollars} - ${inventory_item.cost_in_dollars} ;;
type: number
}
Uma dimensão que depende de outra dimensão em uma tabela derivada pode ter esta aparência:
dimension: average_margin {
sql: (SELECT avg(${gross_margin} FROM ${order_facts.SQL_TABLE_NAME})) ;;
type: number
}
Usuários de SQL mais avançados podem realizar cálculos relativamente avançados, incluindo subconsultas correlacionadas. Observação: nem todos os dialetos do banco de dados são compatíveis com subconsultas correlacionadas:
dimension: user_order_sequence_number {
type: number
sql:
(
SELECT COUNT(*)
FROM orders AS o
WHERE o.id <= ${TABLE}.id
AND o.user_id = ${TABLE}.user_id
) ;;
}
Para mais detalhes, consulte a documentação de um tipo específico de dimensão.
sql
para grupos de dimensões
O parâmetro sql
para um dimension_group
usa qualquer expressão SQL válida que contenha dados em formato de carimbo de data/hora, data e hora, data, época ou aaaammdd.
sql
para as medidas
O bloco sql
para medidas normalmente tem uma destas duas formas:
- O SQL em que uma função agregada (como
COUNT
,SUM
,AVG
) será executada, novamente usando o operador de substituição do Looker, conforme descrito acima. - Um valor com base em várias outras medidas
Por exemplo, para calcular a receita total em dólares, podemos usar:
measure: total_revenue_in_dollars {
sql: ${revenue_in_dollars} ;;
type: sum
}
Para calcular nosso lucro total, podemos usar:
measure: total_revenue_in_dollars {
sql: ${total_revenue_in_dollars} - ${inventory_item.total_cost_in_dollars} ;;
type: number
}
Para mais detalhes, consulte a documentação de um tipo específico de medida.
Para um tipo de medida count
, é possível deixar de fora o parâmetro sql
.
Para outros tipos de medida, se sql
não for especificado, o Looker entenderá que há uma coluna na tabela com o mesmo nome do campo. Como uma medida precisa ter um nome que indique que ela é um conjunto de valores subjacentes, na prática, é necessário sempre incluir um parâmetro sql
.
Desafios matemáticos de SQL
Há dois desafios frequentes que surgem com a divisão no parâmetro sql
.
Primeiro, se você estiver usando divisão no cálculo, quer evitar a possibilidade de divisão por zero. Isso causa um erro SQL. Para fazer isso, use a função SQL NULLIF
. Por exemplo, isto significa "se o denominador for zero, trate-o como NULL":
measure: active_users_percent {
sql: ${active_users} / NULLIF(${users}, 0) ;;
type: number
}
Outro problema é a forma como o SQL lida com cálculos matemáticos inteiros. Se você dividir 5 por 2, a maioria das pessoas esperará que o resultado seja 2,5. No entanto, muitos dialetos SQL retornam o resultado como apenas dois, porque quando ele divide dois números inteiros, ele também fornece o resultado como um número inteiro. Para resolver isso, você pode multiplicar o numerador por um número decimal para forçar o SQL a retornar um resultado decimal. Exemplo:
measure: active_users_percent {
sql: 100.00 * ${active_users} / NULLIF(${users}, 0) ;;
type: number
}
Variáveis líquidas com sql
Também é possível usar as variáveis líquidas com o parâmetro sql
. As variáveis líquidas permitem acessar dados, como os valores em um campo, dados sobre o campo e filtros aplicados ao campo.
Por exemplo, esta dimensão mascara uma senha do cliente de acordo com um atributo de usuário do Looker:
dimension: customer_password {
sql:
{% dynamic if _user_attributes['pw_access'] == 'yes' %}
${password}
{% dynamic else %}
"Password Hidden"
{% dynamic endif %} ;;
}