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 ブロックには、通常、SELECT ステートメントの 1 つの列に入る任意の有効な SQL を指定できます。これらのステートメントは通常、Looker の置換演算子に依存します。この演算子にはいくつかの形式があります。

  • ${TABLE}.column_name は、作業中のビューに接続されているテーブルの列を参照します。
  • ${dimension_name} は、作業中のビューの中にあるディメンションを参照します。
  • ${view_name.dimension_name} は、別のビューにあるディメンションを参照します。
  • ${view_name.SQL_TABLE_NAME} は、別のビューまたは派生テーブルを参照します。(この参照の SQL_TABLE_NAME はリテラル文字列です。置き換える必要はありません)。

sql を指定しない場合、Looker は、基になるテーブルにフィールドと同じ名前の列があると想定します。たとえば、sql パラメータなしで city というフィールドを選択することは、sql: ${TABLE}.city を指定することと同じです。

ディメンションの sql パラメータに集計を含めることはできません。つまり、SQL 集計や LookML メジャーの参照を含めることはできません。SQL 集計を含む 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 パラメータには、タイムスタンプ、日時、日付、エポック、または yyyymmdd 形式のデータを含む有効な SQL 式を指定できます。

メジャーの sql

指標の sql ブロックは、通常、次の 2 つの形式のいずれかになります。

  • 集計関数(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 パラメータの除算では、次の 2 つの課題がよく発生します。

まず、計算で除算を使用している場合は、ゼロで除算して SQL エラーが発生する可能性を防ぐ必要があります。これを行うには、SQL の NULLIF 関数を使用します。たとえば、次の例は「分母がゼロの場合は、代わりに NULL として扱う」という意味になります。

measure: active_users_percent {
  sql: ${active_users} / NULLIF(${users}, 0) ;;
  type: number
}

もう 1 つの問題は、SQL で整数演算が処理される方法です。5 を 2 で割ると、ほとんどの人は結果が 2.5 になると予想します。ただし、多くの SQL 言語では、2 つの整数を割ると結果も整数になるため、結果は 2 になります。この問題を解決するには、分子に 10 進数を乗算して、SQL に 10 進数の結果を強制的に返すようにします。次に例を示します。

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