本页面中提及的
sql参数是字段的一部分。
sql还可以用作派生表的一部分,如sql(针对派生表)参数文档页面中所述。
用法
view: view_name {
dimension: field_name {
sql: ${revenue_in_dollars} - ${inventory_item.cost_in_dollars} ;;
}
}
|
层次结构
sql |
可能的字段类型
维度、维度组、过滤条件、衡量指标
接受
SQL 表达式
特殊规则
根据字段的 type 而变化的 SQL 表达式(如本页面上的详细说明中所述)
|
定义
sql 参数接受多种类型的 SQL 表达式,这些表达式将定义维度、衡量指标或过滤条件。您需要编写的表达式因要创建的字段类型而异。如需详细了解维度和过滤条件类型,请参阅维度、过滤条件和参数类型文档页面;如需详细了解衡量类型,请参阅衡量类型文档页面。另请参阅纳入 SQL 并引用 LookML 对象文档页面。
sql 适用于维度
维度对应的 sql 块通常可以接受任何有效的 SQL 语句,这些语句会放入 SELECT 语句的单个列中。这些语句通常依赖于 Looker 的替换运算符,该运算符有多种形式:
${TABLE}.column_name引用的是与您正在处理的视图相关联的表中的列。${dimension_name}引用您正在处理的视图中的维度。${view_name.dimension_name}引用另一个视图中的维度。${view_name.SQL_TABLE_NAME}引用另一个视图或派生表。(请注意,此引用中的SQL_TABLE_NAME是一个字面值字符串;您无需将其替换为任何内容。)
如果未指定 sql,Looker 会假定底层表中存在与该字段同名的列。例如,选择名为 city 的字段而不使用 sql 参数,相当于指定 sql: ${TABLE}.city。
维度的
sql参数不能包含任何汇总。这意味着它不能包含 SQL 汇总或对 LookML 测量的引用。如果您想创建包含 SQL 聚合或引用 LookML 度量的sql字段,请在度量中使用sql参数,而不是在维度中使用。
一个非常简单的维度,可直接从名为 revenue 的列中获取值,如下所示:
dimension: revenue_in_cents {
sql: ${TABLE}.revenue ;;
type: number
}
依赖于同一视图中另一个维度的维度可能如下所示:
dimension: revenue_in_dollars {
sql: ${revenue_in_cents} / 100 ;;
type: number
}
依赖于不同视图中另一个维度的维度可能如下所示:
dimension: profit_in_dollars {
sql: ${revenue_in_dollars} - ${inventory_item.cost_in_dollars} ;;
type: number
}
依赖于派生表中另一个维度的维度可能如下所示:
dimension: average_margin {
sql: (SELECT avg(${gross_margin} FROM ${order_facts.SQL_TABLE_NAME})) ;;
type: number
}
更高级的 SQL 用户可以执行相对高级的计算,包括相关子查询(注意:并非所有数据库方言都支持相关子查询):
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
) ;;
}
如需了解详情,请参阅特定维度类型的文档。
sql 适用于维度组
dimension_group 的 sql 参数可接受任何有效的 SQL 表达式,其中包含时间戳、日期时间、日期、纪元或 yyyymmdd 格式的数据。
sql 适用于衡量指标
衡量指标的 sql 块通常采用以下两种形式之一:
- 将执行聚合函数(例如
COUNT、SUM、AVG)的 SQL,同样使用 Looker 的替换运算符,如维度的 SQL 部分中所述 - 基于其他多种指标的值
例如,如需计算总收入(以美元为单位),我们可以使用:
measure: total_revenue_in_dollars {
sql: ${revenue_in_dollars} ;;
type: sum
}
如需计算总利润,我们可以使用以下公式:
measure: total_revenue_in_dollars {
sql: ${total_revenue_in_dollars} - ${inventory_item.total_cost_in_dollars} ;;
type: number
}
如需了解详情,请参阅特定指标类型的文档。
对于 count 衡量类型,您可以省略 sql 参数。
对于其他类型的度量,如果未指定 sql,Looker 会假定底层表中存在与该字段同名的列。由于度量应具有一个名称来表明它是基础值集的汇总,因此在实践中,您应始终包含 sql 参数。
SQL 数学挑战
在 sql 参数中使用除法时,经常会遇到两个难题。
首先,如果您在计算中使用除法,则需要防范除数为零的可能性,因为这会导致 SQL 错误。为此,请使用 SQL NULLIF 函数。例如,以下示例表示“如果分母为零,则将其视为 NULL”:
measure: active_users_percent {
sql: ${active_users} / NULLIF(${users}, 0) ;;
type: number
}
另一个问题是 SQL 处理整数数学运算的方式。如果您用 5 除以 2,大多数人会认为结果是 2.5。不过,许多 SQL 方言只会返回结果 2,因为当它除以两个整数时,也会以整数形式给出结果。为解决此问题,您可以将分子乘以一个小数,强制 SQL 返回小数结果。例如:
measure: active_users_percent {
sql: 100.00 * ${active_users} / NULLIF(${users}, 0) ;;
type: number
}
包含 sql 的 Liquid 变量
您还可以将 Liquid 变量与 sql 参数搭配使用。借助 Liquid 变量,您可以访问字段中的值、有关字段的数据以及应用于字段的过滤条件等数据。
例如,此维度会根据 Looker 用户属性遮盖客户密码:
dimension: customer_password {
sql:
{% if _user_attributes['pw_access'] == 'yes' %}
${password}
{% else %}
"Password Hidden"
{% endif %} ;;
}