SQL (適用於欄位)

本頁面是指欄位中的 sql 參數。

sql (適用於衍生資料表) 參數說明文件頁面所述,sql 也可用於衍生資料表。

用量

view: view_name {
  dimension: field_name {
    sql: ${revenue_in_dollars} - ${inventory_item.cost_in_dollars} ;;
  }
}
階層
sql
可能的欄位類型
維度、維度群組、篩選器、指標

接受
SQL 運算式

特別規則
SQL 運算式,會因欄位的 type 而異 (詳情請參閱本說明文件頁面)

定義

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,同樣使用「維度的 SQL」一節所述的 Looker 替代運算子
  • 根據其他多項指標計算出的值

舉例來說,如要計算美元總收益,我們可能會使用:

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 變數

您也可以搭配 sql 參數使用 Liquid 變數。您可以使用 Liquid 變數存取資料,例如欄位中的值、欄位相關資料,以及套用至欄位的篩選條件。

舉例來說,這個維度會根據 Looker 使用者屬性遮蓋顧客密碼:

dimension: customer_password {
  sql:
    {% if _user_attributes['pw_access'] == 'yes' %}
      ${password}
    {% else %}
      "Password Hidden"
    {% endif %} ;;
}