
Omni の is_selected を使って選択されたフィールドに応じてメジャーを動的に切り替えてみた
こんにちは、ikumiです。
Omni でメジャーを作っていると、「このフィールドが選ばれているときだけ計算したい」という場面があります。
テンプレートフィルターの is_selected を使うと、現在のクエリで特定のフィールドが SELECT されているかどうかを検知し、メジャーの計算を動的に切り替えることができます。今回はこれを試してみました。
機能概要
Self-referential Building は、クエリに含まれているフィールドの状態を検知する以下の3つのパラメータを提供しています。それぞれ TRUE または FALSE を返します。
| パラメータ | 検知スコープ | 用途 |
|---|---|---|
{{ view_name.field_name.in_query }} |
SELECT 句 + WHERE 句 | フィールドがクエリのどこかに存在するか |
{{ view_name.field_name.is_selected }} |
SELECT 句のみ | フィールドが結果として選択されているか |
{{ view_name.field_name.is_filtered }} |
WHERE 句のみ | フィールドにフィルターが適用されているか |
試してみた
事前準備
事前に用意してあるbrand_ana__tran ビューのファイルを編集します。
やりたいこと
今回のデータでは、sales(売上)や goal(目標)が累計値として格納されていると仮定します。このようなデータで yyyymm(年月)を選択せずに目標達成率(売上 ÷ 目標)を計算すると、SUM が全行の累計値を積み上げた意味のない数字になってしまいます。
テンプレートフィルターの is_selected を使うと、yyyymm がクエリに含まれているときだけ達成率を計算し、含まれていないときは null を返すメジャーを作れます。今回はこれを試してみました。
1. yyyymm なしで達成率を計算すると何が起きるか確認する
まず is_selected を使わずに達成率メジャーを作り、yyyymm なしで実行したときの挙動を確認します。
tran.view.yaml の measures: セクションに以下を追加します。
measures:
achievement_rate:
sql: |-
SUM(${brand_ana__tran.sales}) / NULLIF(SUM(${brand_ana__tran.goal}), 0) * 100
label: 目標達成率 (%)
Explore で achievement_rate だけを選択し、yyyymm は選択しない状態で実行します。

sales と goal が累計値のため、全行の累計値を SUM で積み上げた意味のない数字が返ってきます。これが問題の状態です。
2. is_selected を追加して yyyymm 選択時だけ計算するようにする
tran.view.yaml の achievement_rate を以下のように更新します。
measures:
achievement_rate:
sql: |-
CASE
WHEN {{ brand_ana__tran.yyyymm.is_selected }}
THEN SUM(${brand_ana__tran.sales}) / NULLIF(SUM(${brand_ana__tran.goal}), 0) * 100
ELSE null
END
label: 目標達成率 (%)
{{ brand_ana__tran.yyyymm.is_selected }} が TRUE(yyyymm が SELECT 句に含まれている)のときだけ達成率を計算し、FALSE のときは null を返します。
3. yyyymm なしで実行して null になることを確認する
Explore で achievement_rate だけを選択し、yyyymm は選択しない状態で実行します。

null が返ってくれば問題ありません。累計値を意図せず積み上げた誤った数字が表示されなくなりました。
4. yyyymm ありで実行して達成率が出ることを確認する
yyyymm も追加して実行します。

年月ごとの目標達成率が計算されて表示されれば完了です。今回の検証データはすべて進捗率が80%になるデータなので少し分かりづらかったですが、任意の挙動となるメジャーを作成できました。
最後に
Omni の is_selected を使って、yyyymm が選択されているときだけ目標達成率を計算するメジャーを作ってみました。
is_selected のほかに is_filtered(フィルター適用時の検知)や in_queryも用途に応じて使い分けられます。「このメジャーはこのディメンションと一緒に使うもの」という意図をモデルで表現したい場面でぜひ試してみてください。










