日本オラクル
テクノロジーコンサルティング本部 DWHアーキテクト
曽根原 ふじお


1995年にOLAPプロジェクトに関わってから一貫してBI&DWH関連のスペシャリストとして 研修や実際のプロジェクトのPMなどを経験。
新しいテクノロジーを覚えるのは好きだが、 最近の新製品リリースは早すぎて、ついていくのが・・・。

 計算データを表示するには

■前回はOracle OLAPの基礎編として、実際に多次元キューブを見たり、作り替えたりして馴染んでもらいました。今回は実際のシステムで役立つような、より複雑な使い方をご紹介します。
分析レポートなどでは、さまざまな数値データを扱います。例えば売上金額だけをとっても、前年の値、前年の値との差、前年の値からの増加率など、元となる数値データから多くの数値データを見る必要が出てきます。これらのデータをどう表示したらいいのでしょう。

Oracle OLAPでは、元となる(実績の)売上金額が時系列であれば、それを使って前述したような数値データを簡単に表示することができます。リレーショナル・データベース管理システム(RDBMS)をベースにしたいわゆるR-OLAPでは、前年金額というカラムを別途用意してデータを格納したりしますが、これはディスク容量を余計に使うため非効率です。Oracle OLAPではそのような必要はありません。例えば前年値はすでにデータ―ベース内に格納されているので、それらをなんらかの計算式で呼び出せばいいはずです。Oracle OLAPでは計算式で求めることができるメジャーは「計算済メジャー」と呼びます。「計算済」とありますが、事前に計算するわけではなく計算式だけを保持し、リアルタイムに計算結果を表示します。

 

 時系列関連の計算済メジャー

■計算済メジャーは、時系列に関するものだけでも次のような種類が考えられます。

 

名称 一般的な意味 計算式
前期(売上金額) 前月の値  
前期差 前期と今期(今月)の差 =今期の値-前期の値
前期比 前期に対する今期の変化率 =(今期の値/前期の値)-1
前年(売上金額) 前年度同月の値  
前年差 前年と今期の差 =今期の値-前年の値
前年比 前年に対する今期の変化率 =(今期の値/前年の値)-1
累計(売上金額) 今年度期初からの累計値  
前年度累計(売上金額) 前年度期初からの累計値※1  
累計差 今年度累計と前年度累計の差 =累計-前年度累計
累計比 前年度累計に対する今年度累計の変化率 =(累計/前年度累計)-1

 

※1最近は分析要件が厳しくなり、累計値に関しては週単位、日単位での比較が求められています。例えば、11月10日時点の今年度の累計値は2006/4/1から2006/11/10までの値となるため、前年度の累計も2005/4/1から2005/11/10までの数値を使うということがあります。従来は前年度累計といえば、4/1から3/31までの合計値でした。

インデックスに戻る

 

 計算済メジャーの作成

注意:本連載のデータはUS OTNサイトで入手できるグローバルデモのデータを、一部日本語に修正して使っています。実際の画面の表示と多少が異なることがありますのでご了承ください。

■それでは計算済メジャーを作成してみましょう。前回作成したキューブUNITS_NEWを使います。Oracle AWMの左側ツリーでキューブの下に「計算済メジャー」というフォルダがあります。それを選択した状態で右クリックのメニューから「計算済メジャーの作成…」を選択します。

「この計算の名前を指定」のフィールドに計算済メジャーの名称を入力してください。そして下の「計算タイプ」のリストから、「前回/将来の比較」の「前回値」を選択します。

ウィザードの次の画面では、「メジャー」に計算の元となるメジャーを選択します。ここでは売上個数(UNITS)を選択します。「時間の階層」には「Calendar Year」が選択されていることを確認します。そして、「比較対照期間」には「前期間」を選択します。

ウィザードの最後の画面では各種名称などを入力します。ここでは次のように入力します:

名前 UNITS_PP(最初の画面で入力したものと同じ項目です)
ショート・ラベル 前期売上個数
ロング・ラベル 前期売上個数
説明 前期売上個数

 

では、実際にどのようにデータが表示されるか確認してみましょう。作成した計算済メジャーUNITS_PP(前期売上個数)を選択して、右クリックのメニューから「データUNITS_PPを表示…」を選びます。

これだけでは前期の数値が正しく表示されているか分かりませんので、一緒に、元となるメジャー「売上個数」も表示してみましょう。データ・ビューアのメニュー「ファイル」から「クエリー・ビルダー」を選択します。すると以下のようなダイアログが表示されますので、左側の「選択可能」の項目一覧から「売上個数」を選択し、右矢印ボタンを押して右側の「選択済」に移します。

「OK」を押すと売上個数と前期売上個数の両方が表示されると思います。レイアウトを見やすく変更してみてください。次のようにすれば確認できます。

各年の欄にはきちんと前期(=前年)の数値が表示されているようです。試しに、時間ディメンションをドリルダウンしてみましょう。

どうですか?四半期レベルや、月レベルでも、前期の数値が表示されているのが確認できましたか?
これと同等のことをR-OLAPで実現するのはなかなか大変です。現在は分析関数のLAG関数がありますが、それを使ったとしても、データが存在しない(例えば、売上数量が発生しない月など)場合の処理やドリルダウン時に参照先がずれる問題などがあり簡単にはいきません。
しかもたった1つの計算済メジャーを定義するだけで、年、四半期、月のすべてのレベルで前回の値を参照することができています。

 

Oracle OLAPのすごい点:「時系列の計算はお手のもの」

 

そのほかにも、時系列に関連する計算データも、同様のウィザードによる方法で簡単に作成することができます。いま作成した「前回値」に関係するものとして、
・前期間との相違
・前期間との相違率
があります。これらは今回値と前回値の間の差分や増加(減少)率を出すためのものです。また、前回値の1つのパターンとして前年度値がありますが、これも計算ウィザードの設定を変えるだけで同様に作成できます。ところで、なぜOracle OLAPでは時間のレベル(年や四半期)ごとの計算や前年度という計算ができるのでしょうか?それは時間ディメンションに秘密があります。
時間ディメンションを見ると、他のディメンションと異なり、ディメンション・タイプが「時間ディメンション」となっています。このタイプの場合、ディメンションの属性に「TIME_SPAN(期間)」、「END_DATE(終了日)」の2項目がデフォルトで追加されます。このような付加情報をもたせることにより、前期間や年度という情報を認識しているわけです。

インデックスに戻る

 

 その他の計算データ

■時系列以外にも、計算データを活用できる場はたくさんあります。次は商品ディメンションに関して、商品全体の売上げを100とした場合に各製品がどの程度売れているか、その内訳を表示する計算済メジャーを作成してみましょう。

まず、先ほどと同様に計算済メジャーを「計算ウィザード」で作成します。

1画面目  
  ->名前 UNITS_PROD_SHARE
  ->計算タイプ 「拡張演算」の「シェア」
2画面目  
  ->シェア 売上個数
  ->対象 商品
  ->階層 値ベース階層
  ->パーセンテージとして 「メンバー」を選択して「商品計」
3画面目  
  ->名前 UNITS_PROD_SHARE(上記で入力したまま)
  ->ショート・ラベル 売上個数商品別内訳
  ->ロング・ラベル 売上個数商品別内訳
  ->説明 売上個数の商品計に対する内訳

 

これでベースとなる計算済メジャーは完成です。ここではさらに見やすいように、100倍してパーセント表示にしてみましょう。もうひとつ計算済メジャーを作成します。

1画面目  
  ->名前 UNITS_PROD_SHARE_100
  ->計算タイプ 「基本演算」の「掛け算」
2画面目  
  ->値 売上個数商品別内訳
  ->掛ける値 100
3画面目  
  ->名前 UNITS_PROD_SHARE_100(上記で入力したまま)
  ->ショート・ラベル 売上個数商品別内訳%
  ->ロング・ラベル 売上個数商品別内訳%
  ->説明 売上個数の商品計に対する内訳%

 

作成した計算済メジャーを表示してみましょう。

商品ディメンションを縦軸にしてドリルダウンすると、商品全体に対する内訳がパーセンテージで表示されます。

 

Oracle OLAPのすごい点:「さまざまな計算がウィザードで簡単にできる」

 

インデックスに戻る

 

 データの絞込み

■せっかくなのでOracle AWMのクエリー・ビルダーをもう少し使ってみましょう。クエリー・ビルダーはデータ・ビューアに表示する項目やレイアウトを細かく制御できます。

まず、メジャー(ここではUNITS_NEW)を選択してデータを表示してください。メニューの「ファイル」から「クエリー・ビルダー」を選択するか、ツールバーの  アイコンで起動できます。

最初にあらわされる「アイテム」タブでは左側にアナリティック・ワークスペース内で使えるアイテム一覧が表示されています。このうち、画面に表示する項目が右側に選ばれています。左側の顧客ディメンションの下から「Market Segment」階層を選択してください。互換性がない旨の警告が出ますが、これはすでに選択されているデフォルトの階層「Shipments」と異なるからです。

Market Segment階層を選択して「OK」を押すと、顧客ディメンションが下図のようにドリルダウンできます。

もう一度クエリー・ビルダーを開いてください。2つめの「レイアウト」タブでは縦軸、横軸にどのアイテムを表示するかを指定できます。これらはデータ・ビューアの画面でも直接実行できます。

3つめの「ディメンション」タブでは、表示する項目を絞り込むことができます。

最も基本的な使い方は、左側のメンバー・ツリーからドリルダウンして目的の項目を選択する方法です。右側では1)選択する手順が「ステップ」タブに、2)選択した結果のメンバーが「メンバー」タブに表示されます。実際に商品ディメンションのメンバーを選択してみましょう。「選択」のドロップダウン・リストから商品を選択します。下のメンバー一覧から「モニター」と「PC」を選択すると、下図のように右側にメンバーを選択した場合の操作手順と、その結果が表示されます。

インデックスに戻る

 

 高度なデータの絞込み

■次に、もう少し複雑な絞込みをしてみましょう。「条件」のタブで「一致」をドリルダウンし、「abc次を含む名前」という項目を選択すると、右端にエンピツマークのボタンが表示されます。それをクリックしてください。

下記のダイアログが出ますので、各項目を指定してください。

アクション 「追加」
レベル 「すべての商品ディメンション」
テキスト 48x と入力
演算子 「次を含む」
テキストの一致 「任意のレベル」

 

そして「OK」を押すと、48xを名前に含むメンバーが追加で選択されます。データ・ビューアでの結果は下図のとおりになるはずです。

次に、顧客別のランキング機能を使ってみましょう。まずクエリー・ビルダーの「ディメンション」タブで「顧客」を選択しておいてください。同様に、「条件」タブから「上/下」を選択します。そこには「売上個数に基づく上位10」という条件がすでに用意されています。しかし、このままでは意図しない結果になるので、いくつか設定を変更します。

 

アクション 「追加」にすると、Total Customerに条件に合ったメンバーが追加されます。
レベル Total Customerの数値は必ず1番なので、除外するために「保持」を選択します。同様に、異なるレベル間で数値のランキングを出してもあまり意味がありませんから、ここでは「Ship To(出荷先)」に限定します。
メジャーの対象 ここの時間ディメンションの設定「All Years」も無意味な絞込みになってしまうので、「制限の付与…」で時間ディメンションの設定を2004にしてください。

 

これで「2004年の全商品の売上個数がShip To(出荷先)レベルで上位の10項目を選択する」という絞込み条件ができました。ちなみにランクの部分の%にチェックを入れると、上位10%を占める項目が選択されます。条件を設定したら、クエリー・ウィザードの右側「メンバー」タブで選択されるメンバーを事前に確認できます。

実際にデータを表示すると下図のような感じになります。2004年の売上個数で顧客名がソートされていることが確認できると思います。

ここでも、R-OLAPに比べて表示が格段に早いことを感じていただけると思います。これは、項目を集計してから並べ替えるという手間が省かれているためです。

 

Oracle OLAPのすごい点:「ランキング計算もお手のもの」

 

インデックスに戻る

 

 ディメンション属性による絞込み

■Globalデモには属性をもつディメンションがあります。それが商品ディメンションです。モデル・ビューのツリー表示で見ると次のとおり、標準のSHORT_DESCRIPTION(ショート・ラベル)、LONG_DESCRIPTION(ロング・ラベル)以外に4つの属性が設定されていることが分かります。これらは、RDBMSにおけるマスタ表のキー項目以外の項目にマッピングされる付加情報のような位置付けとなります。

それではこの属性を使ってデータを絞り込んでみましょう。この商品ディメンションを使っているメジャーは、デモ・スキーマによる「UNITS_CUBE」に含まれています。売上単価を選択してクエリー・ビューアでデータを絞り込んでみましょう。「条件」タブの「一致」を選択すると、属性をもつディメンションの場合には下のような「属性名 = 詳細…」という選択肢が表示されます。

例えばここで、下図のように

アクション 選択
レベル Item
属性 Buyer
演算子 等しい(=)
Kenyon
とすると商品ディメンションを「Itemレベルのメンバーの中でBuyer属性がKenyonと等しいもの」に絞り込むことができます。

 

念のために結果を示すと、次のとおりです。

 

Oracle OLAPのすごい点:「属性を使うとR-OLAPライクな絞込みが可能」

 

インデックスに戻る

 

 メジャーフォルダ

■メジャー・フォルダについても説明します。メジャーをOracle AWMで作成すると、クエリー・ビルダー内ではずらっと並べられた形で見えてしまいます。それらを関連のあるまとまりにするためにメジャー・フォルダを利用します。

では、実際にメジャー・フォルダを使ってみましょう。まずメジャー・フォルダを作成する前の状態を確認しておきましょう。クエリー・ビルダーでは、メジャーが個別に表示されているのが確認できます。

いったんOracle AWMのモデル・ビューに戻って、「メジャー・フォルダ」を選択した状態で右クリックのメニューから「メジャー・フォルダの作成…」を選択します。名前や、ショート・ラベルなどメジャー・フォルダの名前を指定します。

メジャー・フォルダに入れたいメジャーを左側の「使用可能なメジャー」一覧から選択して、「作成」を押せば完成です。もう一度クエリー・ビルダーを開いて見てみましょう。

 

Oracle OLAPのすごい点:「関連性のあるメジャーをまとめて使い勝手向上」

 

インデックスに戻る

 

 まとめ

■第2回は、実際のプロジェクトで役立つ便利な機能の計算済メジャーと、多次元データを絞り込む基本的な考え方をご紹介しました。次回は少し趣向を変えて、キューブの物理設計に関するテクニックをご紹介します。次回もお楽しみに。

インデックスに戻る