3)データの抽出とスライサ
MDXではデータ抽出の考え方がSQLと大きく異なります。SQLでは「データの検索条件」をWHERE
句に記述しますが、MDXの場合は「スライサ」と「フィルタ」の2通りの考え方でデータを絞り込みます。
スライサ
元のキューブから、必要な部分を「切り取る」のがスライサです。あくまで「切る」という行為であることに注意してください。キューブを「切る」のですから、1つ以上のディメンションから、それぞれメンバーを指定します。
このようにキューブを「切り取り」ます。SQLのWHERE
句のように等号などの演算子を使用してデータの値に条件を付けるのではないことに注意してください。
フィルタによるデータ抽出
SQLで言う「検索条件」に感覚的に近いのは、「スライサ」よりも「フィルタ」かもしれません。フィルタはWHERE
句ではなく、SELECT
句でディメンションの指定をする際にFILTER
関数として記述します。
構文:FILTER ( セット,条件式 )
例として、「2009年7月の売上金額が50,000円以上の顧客」を抽出してみます。
SELECT { [Measures].[URIKINGAKU] } ON COLUMNS, { FILTER([TOKUISAKI].[TOKUIMEI].CHILDREN,
[Measures].[URIKINGAKU]>50000) } ON ROWS FROM [Sales] WHERE ([URIAGE DATE].[YYYY-MM-DD].[2009年].[07月])
実行結果は次のようになります。
![実行結果](http://cz-cdn.shoeisha.jp/static/images/article/4335/21s.gif)
このMDXで注意して頂きたいのは次の2点です。
(1)縦軸と横軸に同じディメンション(メジャー)が登場している
MDXの基本構文には、「異なる軸で同じディメンションを指定することはできない」というルールがあります。しかしこのMDXでは縦軸と横軸の両方にメジャーディメンションが指定されています。なぜこのような記述が許されるのでしょうか?
その理由は、このFILTER
関数の戻りセットが[TOKUISAKI]
ディメンションであり、メジャーディメンションではないからです。FILTER
関数の2つ目のパラメータである[Measures].[URIKINGAKU]>50000
という条件式でメジャーディメンションを使用していますが、これはあくまで[TOKUISAKI]
ディメンションのメンバーを絞り込むための条件に過ぎないため、他の軸で指定したディメンションを使用しても何ら問題ありません。
(2)FILTER関数の条件式を評価する対象は指定したセットのメンバー単位である
FILTER
関数では第1パラメータでセットを指定しますが、その構成メンバーが階層構造の途中のレベル(商品ディメンションにおける「商品分類」など)である場合、そのレベルでの集計値が評価の対象となります。つまりSQLで使用するGROUP BY
やHAVING
の考え方が、階層構造化したディメンションでは自動的に判断されます。
従って、例3の
FILTER( [TOKUISAKI].[TOKUIMEI].CHILDREN,
[Measures].[URIKINGAKU]>50000)
という記述は、スライサ部分とあわせて、「2009年7月の顧客別売上合計金額が5万円を超えている」という意味になります。
まとめ
今回はMDXの基本構文を解説しました。次回はクエリー結果の整形についていくつかの手法を解説します。
参考資料
- 『SQL Server Books Online - Microsoft』
- 『MDX Solutions』 George Spofford・Sivakumar Harinath・Christopher Webb・Dylan Hai Huang・Francesco Civardi著、Wiley社、2006年3月