sql(适用于字段)

本页面中提及的 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_groupsql 参数可接受任何有效的 SQL 表达式,其中包含时间戳、日期时间、日期、纪元或 yyyymmdd 格式的数据。

sql 适用于衡量指标

衡量指标的 sql 块通常采用以下两种形式之一:

  • 将执行聚合函数(例如 COUNTSUMAVG)的 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 %} ;;
}