メジャーの値形式を任意の通貨単位で可変に表示させる #Looker
Looker勉強中のikumiです。今回は、Explore上で表示するメジャーの値形式を、任意の通貨単位で可変に変更する方法を試してみました。
ユースケース
Exploreで総売上を表示する際の通貨単位を、円・千円・百万円単位でそれぞれ可変に選択できるように設定します。
さっそくトライ
parameterの作成
今回可変にしたい通貨の単位を選択できるようにするため、まずはparameterの作成をします。
parameter: currency_unit { type: number allowed_value: { label: "総売上(円)" value: "1" } allowed_value: { label: "総売上(千円)" value: "2" } allowed_value: { label: "総売上(百万)" value: "3" } }
元となる総売上のmeasureを定義する
集計したい総売上の値を定義します。
dimension: sale_price { label: "売上" type: number sql: ${TABLE}.sale_price;; } measure: total_sale_price { label: "総売上" type: sum sql: ${sale_price} ;; }
可変メジャーの作成
ここでパラメーターの値に応じて変化するmeasureを定義します。
measure: total_sales_price_variable { type: number label_from_parameter: currency_unit sql: {% if currency_unit._parameter_value == 1 %} ROUND(${total_sale_price}) {% elsif currency_unit._parameter_value == 2 %} ROUND((${total_sale_price}/1000),1) {% elsif currency_unit._parameter_value == 3 %} ROUND((${total_sale_price}/1000000),1) {% endif %} ;; html: {% if currency_unit._parameter_value == 1 %} <p>¥ {{rendered_value}}<p> {% elsif currency_unit._parameter_value == 2 %} <p>¥ {{rendered_value}} K<p> {% elsif currency_unit._parameter_value == 3 %} <p>¥ {{rendered_value}} M<p> {% endif %} ;; }
- sqlパラメーター内での記述のポイント
- Liquid構文を使用して、パラメーターの値に応じた表示単位の計算を行うように設定
- htmlパラメーター内での記述のポイント
- 同様に、パラメーターの値に応じて通貨単位が表示されるように設定
- label_from_parameterの使用
- ラベルにはlabel_from_parameterを使用しています。これを使用すると、パラメーターで設定したlabelに応じてビジュアライゼーション内での表示も変化するようになります
結構複雑になっていますが、、ここに至るまでの苦悩は後ほど記載します。。
Exploreで表示を確認
さて、早速Exploreで確認してみます。
- フィールドピッカーから「currency_unit(パラメーター)」と「total_sales_price_variable(可変メジャー)」を選択して実行
- パラメーターで選択されている「総売上(円)」の単位で表示されています。
- パラメーターで選択されている「総売上(円)」の単位で表示されています。
- パラメーターを「総売上(千円)」に変更
- ラベルと、表示単位が千円単位に変更されています
- ラベルと、表示単位が千円単位に変更されています
- パラメーターを「総売上(百万円)」に変更
- 同様にラベルと表示単位が百万円単位に変更されています
- 同様にラベルと表示単位が百万円単位に変更されています
これで設定は完了です。
小話
実はこれを実現させるには諸々苦労がありまして、まず最初に実現する方法を考えたときに、大体2つの方法が考えられるかなと思っていました。
- value_formatを可変で選択できるようにする
- sqlパラメーター部分で完結させる
まず、value_formatを可変にできないか、、についてはLiquid構文をこのパラメーター内で使用できない、といった理由でそうそうに諦めました。
続いてsqlパラメーター部分で完結させる方法として、記号をCONCATでくっつけて表示させればよいじゃないか。と思ってトライしてみました。パラメーターと元の総売上measureを作成するまでは同じステップで、sqlを以下のように記載。
measure: total_sales_price_variable { type: number label_from_parameter: currency_unit sql: {% if currency_unit._parameter_value == 1 %} CONCAT("¥",ROUND(${total_sale_price})) {% elsif currency_unit._parameter_value == 2 %} CONCAT("¥",ROUND(${total_sale_price}/1000),"K") {% elsif currency_unit._parameter_value == 3 %} CONCAT("¥",ROUND(${total_sale_price}/1000000),"M") {% endif %} ;; }
実際にExploreで確認すると、nullになってうまくいかないみたいです。元のDBでSQLを実行した際は正しく表示できるので構文が間違っているわけではないので、理由が特定できませんでした。。
さいごに
いろいろ紆余曲折しつつたどり着いた方法で表示通貨単位を可変にしてみました。もしかしたらよりいい方法があるかもしれませんね。今後も精進します!