概要
OAC (Oracle Analtyics Cloud) のワークブック(Data Visualization, DV)は任意のサブクエリを直接書けませんが、セマンティックモデル側で「フィルタ付きメジャー」を定義し、DVのパラメータで閾値を動的に変えれば、サブクエリ相当の要件をスマートに実現できます。本記事ではOracleデータベースのSHサンプルスキーマ(SALES・TIMES・CUSTOMERS)を用いて、以下を段階的に構築します。
- 2000年1月に閾値以上購入した顧客を抽出
- 抽出した顧客の2000年2月の購入額を並列表示して分析
- 閾値はDVのパラメータでユーザーが変更可能
2000年1月にたくさん買ってくれた顧客の、2000年2月における購入行動を分析します。
データセットを「手書きSQL」で作成すれば副問合せも可能ですが、それは別の機会に紹介します。
想定読者
- OACのDVとセマンティックモデル(Semantic Modeler)を活用した設計に関心のある方
- 既存SQLをDVに持ち込むのではなく、モデル側で再利用可能なロジックを組みたい方
前提
- データ: OracleデータベースのSHスキーマ(SALES: ファクト, TIMES: 時間, CUSTOMERS: 顧客)
- OACからSHに接続済み(Oracle DB/ADWなど)
- OACのセマンティックモデルを新規作成できる権限
- OACは、2025年9月版を使用しました
ゴールの全体像
- モデル側に以下を用意
- 販売金額(基本メジャー)
- 販売金額 (2000年1月) = 2000年1月で固定集計
- 販売金額 (2000年2月) = 2000年2月で固定集計
- DV側
- 数値パラメータ Min Amount(既定値100)
- フィルタ条件:販売金額 (2000年1月) >= Min Amount
- テーブル/棒グラフで顧客別に 1月/2月 購入額を表示
セマンティックモデルの作成
物理レイヤーの作成
手順1:セマンティックモデルの作成と関係定義
- OACで「作成 > セマンティックモデル」から新規モデルを作成
- データベースから SALES, TIMES, CUSTOMERS を追加
- リレーションを設定
- SALES.TIME_ID → TIMES.TIME_ID(多対一)
- SALES.CUST_ID → CUSTOMERS.CUST_ID(多対一)
論理レイヤーの作成
ビジネスモデルを作成します。(作成例)
手順2:次元の設定
- TIMESを時間次元に指定(Dimension Type: 時間)
- レベル例:Year → Month → Day
- 主キー/レベルキー例:
- Year: CALENDAR_YEAR
- Month: CALENDAR_MONTH_DESC
- Day: TIME_ID
- CUSTOMERSを通常次元に指定
- キー: CUST_ID
- 表示用属性: 氏名(必要に応じてフルネーム派生列を作成)
作成例
手順3:基本メジャーの作成(Fact)
- SALESをFactとして指定
- 販売金額 = SUM(SALES.AMOUNT_SOLD) を作成
- 必要に応じて数量など他メジャーも定義
作成例
ここまでで、基本的な論理層(ビジネスモデル)が作成できました。
手順4:月固定の「フィルタ付きメジャー」を作成
「販売金額 (2000年1月)」列の作成
ビジネスモデルの論理ファクト表に、新規列を追加します。
名前を「販売金額 (2000年1月)」とし、ソースを「論理式」に変更します。
「fx」をクリックして式エディタを表示し、次の式を入力します。
FILTER(販売金額 USING 年月='2000-01')
「販売金額 (2000年2月)」列の作成
「販売数量 (2000年1月)」列と同じ要領で作成します。
FILTER(販売金額 USING 年月='2000-02')
ポイント
- メジャー内部で月を固定しているため、DVで別の期間フィルタをかけても各メジャーは指定月だけを集計
プレゼンテーションレイヤーの作成とデプロイ
手順5:プレゼンテーションの整理と公開
今回はテストのため、公開する項目を絞っています。
保存して検証します。
問題なければデプロイします。
ワークブックでの操作
手順6:DVワークブックでパラメータを作成
新規ワークブックを作成し、上記サブジェクト領域を追加
パラメータの新規作成
- 名称: Min Amount
- データ型: 整数
- 初期値: 100(任意)
手順7:可視化の作成と条件設定
ビジュアライゼーションを作成します。
- タイプ:表
- 列配置
- 顧客ID
- 販売金額 (2000年1月)
- 販売金額 (2000年2月)
フィルタ設定
作成したビジュアライゼーションに式フィルタを設定します。
販売金額 (2000年1月) >= @parameter("Min Amount")(100)
これで「2000年1月に閾値以上購入した顧客」のみを行として表示し、同じ行でその顧客の「2000年2月の購入額」を並べて比較できます。
動作確認の観点
- ダッシュボードフィルタでパラメータの値を変更すると、表示顧客の絞り込みが即時に変わる
- 2000年1月 の降順で並べると上位顧客が把握しやすい
- 副問合せと違い、2000年2月に売上のない顧客も表示される
応用の可能性
- 比率メジャー(2月/1月)を追加
- 期間の固定を相対化
- セッション変数を用い、FILTERの条件を変数参照にすれば「当月/前月」分析に展開可能
- パフォーマンス
- SALES.TIME_ID, SALES.CUST_ID、TIMES.TIME_IDに適切なインデックス
- カーディナリティが高い属性を過度に軸に入れない(顧客×日付×製品の細分化は高コスト)
- そもそも、FILTER USINGは高コストになりがちなので、事前にテストは必須
まとめ
セマンティックモデルで「フィルタ付きメジャー」を作ることで、DVではサブクエリを直接書かずとも、「ある月で条件を満たす顧客集合に対し、別月のKPIを評価する」という実務的な要件を実現できます。
さらにDVのパラメータを組み合わせれば、ユーザーは閾値を自由に調整しながら、顧客セグメントの反応(翌月購買など)を直感的に分析できます。

















