[Looker]Explore上のフィルタ欄で入力したフィールドの値だけを加算する方法 #looker

2021.08.17

さがらです。

Lookerで「数個~数十個の数値型のフィールドがあるとき、Explore上のフィルタ欄で入力したフィールドの値だけを加算する」ということをやってみました。

複数のフィールドを足し合わせないと目的の集計値が得られず、かつ必要とするフィールドが部署や人によって異なるときに臨機応変に対応できる方法となります。

実現したこと

冒頭の説明だけだとわかりづらいと思いますので、改めてデータ付きで説明します。

例えば、下図のようなデータがあったとします。

この時、このvalue1とvalue2について、部署ごとに使い方が以下のように異なっていたとします。

  • 部署その1の人:value1を、「売上」として使いたい
  • 部署その2の人:value2を、「売上」として使いたい
  • 部署その3の人:value1とvalue2を足した値を、「売上」として使いたい

今回の例のように場合分けの数が少なければ、それぞれ対応するメジャーを作成するだけで十分かもしれません。 しかし、仮に集計対象となる数値型のフィールドが10個以上あった時には同じことが言えるでしょうか?…正直、LookMLで定義するメジャーの数が多くなりすぎて、やっていられなくなると思います。笑

こういったときに臨機応変に対応できるよう、Exploreの画面上で各ユーザーが集計対象のフィールドを入力できる仕組みを実装してみました。

サンプル

使用するデータは先程と同じです。

このデータに対して、Exploreのパラメータ上で入力した内容に応じてメジャーの内容が動的に切り替わっているのが下図からわかると思います。

どちらも必要な時は「value1 value2」と全て入力、value1だけが必要な時は「value1」と入力することで、切り替えが可能となっています。

作成したLookMLファイルについて

関連が強いのはviewファイルのため、以下にviewファイルの内容を記します。必要に応じて、このviewを用いたexplore内でalways_filterを用いて、作成したパラメータを入れてあげても良いと思います。

view: optional_measure {

  derived_table: {
    sql:
      SELECT 'aaa' AS id, 1 AS value1, 2 AS value2
      UNION ALL
      SELECT 'bbb', 10, 20
      UNION ALL
      SELECT 'ccc', 100, 200
      UNION ALL
      SELECT 'ddd', 1000, 2000
       ;;
  }

  parameter: optional_param {
    description: "加算したいフィールド名を記述するパラメータ"
    type: string
    default_value: "value1 value2"
  }

  dimension: id {
    type: string
  }

  dimension: optional_value {
    description: "パラメータに記述されたフィールドを加算するためのdimension"
    type: number
    sql: CASE WHEN {% parameter optional_param %} LIKE "%value1%" THEN ${TABLE}.value1 ELSE 0 END
         + CASE WHEN {% parameter optional_param %} LIKE "%value2%" THEN ${TABLE}.value2 ELSE 0 END
         ;;
  }

  measure: total_optional_value {
    type: sum
    sql: ${optional_value} ;;
  }

}

ポイント

パラメータについて

ユーザーがExplore上で自由に入力して値を切り替えることが出来るようにするには、パラメータを使う必要があります。

default valueはよく使用されるパターンを入れておくと良いと思います。

  ## コードから抜粋
  parameter: optional_param {
    description: "加算したいフィールド名を記述するパラメータ"
    type: string
    default_value: "value1 value2"
  }

加算を行うdimensionについて

事前に、集計を行いたいフィールドを加算するdimensionを定義しておきます。書き方はsqlパラメータ内でCASE文を各フィールドごとに記述して、パラメータに対象のフィールド名が書いてある場合はそのフィールドの値を、書かれていない場合は0を、という条件分けをしております。

  ## コードから抜粋
  dimension: optional_value {
    description: "パラメータに記述されたフィールドを加算するためのdimension"
    type: number
    sql: CASE WHEN {% parameter optional_param %} LIKE "%value1%" THEN ${TABLE}.value1 ELSE 0 END
         + CASE WHEN {% parameter optional_param %} LIKE "%value2%" THEN ${TABLE}.value2 ELSE 0 END
         ;;
  }

余談

フィルタ欄で手入力などせず、使いたいフィールドをマウスクリックで複数選択できるのが理想なんですけどね…これは難しそうでした。無念。