29 MDX問合せの記述
MDXは、Essbaseからデータを取得する問合せを発行するために使用できる、SQLのような言語です。MDXは、ASOキューブでの式の定義、メタデータの問合せ、メンバー名の修飾、データまたはメタデータのサブセットの説明にも使用されます。MDXを学習するための最良の方法は、問合せを記述することです。
この項では、一連の演習でSample.Basicキューブに対する問合せを記述することで、MDXについて学習します。
MDX問合せの記述の前提条件
演習を実施するには、次のものが必要になります。
-
テキスト・エディタ: MDX問合せを記述するため
-
Sample BasicによるEssbaseインスタンスへのアクセス
Sample Basicを入手する必要がある場合は、アウトライン・プロパティを詳しく知るためのサンプル・キューブの作成のステップに従います(インポートのみを実行し、アウトライン・プロパティの設定はスキップします)。
-
MaxLクライアント: Essbaseに問合せを発行するため
MDX問合せテンプレートの作成
EssbaseでMDXの使用を開始できるように、MDX問合せの基本形式について学習します。SQL文と同様に、MDX問合せは通常はSELECTで始まります。
この項では、単純なMDX問合せを開発するための基礎として使用する、テンプレートを作成します。
ほとんどの問合せは、次の文法的フレームワークに基づいて作成できます。
SELECT
{}
ON COLUMNS
FROM Sample.Basic
1行目にあるSELECTは、MDX文の本体を開始するキーワードです。
2行目にある中カッコ{ }
は、セットのプレースホルダです。前述の問合せでは、セットは空ですが中カッコはプレースホルダのままです。
演習1: MDX問合せテンプレートの作成
問合せテンプレートを作成するには:
-
Sample.Basicキューブに対して実行できるサンプル問合せを格納するフォルダを作成します。
-
テキスト・エディタを使用して、空白のファイルに次のコードを入力します。
SELECT {} ON COLUMNS FROM Sample.Basic
-
qry_blank.txt
としてファイルを保存します。
MDXセットとタプル
1つ目の問合せを記述し、MaxLクライアントでそれを実行してSample Basicキューブからデータを取得します。
セット
MDXセットは空にすることも、タプルのコレクション、またはセットのコレクションにすることもできます。
例として、空のセットを次に示します。
{ }
セットは、中カッコ{}
で囲まれている必要があります。そのセットが、セットを戻すMDX関数で表されている場合は例外です(関数の詳細は後述します)。
次に、1つのタプルで構成されているセットを示します。
{[Cola]}
次の問合せでは、{([Cola], [Actual])}
も、1つのタプルで構成されているセットですが、この場合、タプルに複数のメンバー名があります。
SELECT
{([Cola], [Actual])}
ON COLUMNS
FROM Sample.Basic
{([Cola], [Actual])}
は、2つのディメンション(ProductとScenario)からの2つのメンバー(ColaとActual)で構成されているタプルです。
ディメンション・ルール
1つのセットに複数のタプルがある場合、各タプルのメンバーは、同じ順序で、同じEssbaseディメンションを表している必要があります。つまり、すべてのタプルに、他と同じディメンションがある必要があります。
-
OK: 次のセットは、ディメンショナリティが同一の、2つのタプルからなります。
{(West, Feb), (East, Mar)}
-
OKでない: 次のセットでは、FebとSalesは別々のディメンションからのものであるため、ディメンショナリティのルールが守られていません。
{(West, Feb), (East, Sales)}
-
OKでない: 次のセットでは、2つのタプルに同じディメンションが含まれていますが、2番目のタプルでディメンションの順序が逆であるため、ディメンショナリティのルールが守られていません。
{(West, Feb), (Mar, East)}
タプルとメンバー名
タプルとは、任意の数のディメンションからメンバーまたはメンバーの組合せを参照する方法です。たとえば、Sample.Basicキューブでは、これらはすべて有効なタプルです。
Jan
(Jan, Sales)
([Jan],[Sales],[Cola],[Utah],[Actual])
メンバー名は、次の方法で指定できます。
-
実際の名前または別名を指定します。次に例を示します。
-
Cola
-
Actual
-
COGS
-
[100]
メンバー名が数字で始まる場合、またはメンバー名にスペースが含まれている場合は、
[100]
や[New York]
のように大カッコで囲む必要があります。ただし、明確にしてコードを読みやすくするため、メンバー名の大カッコをすべてのメンバー名で使用することをお薦めします。メンバー名がアンパサンド(&)で始まる場合は、
["&xyz"]
のように引用符で囲む必要があります。これは、先頭のアンパサンドが代替変数用に予約されているためです(「MDX問合せでの変数」を参照)。これは、StrToMbr("&100")
として指定することもできます。属性メンバーについては、(メンバーを一意に識別するために修飾された)ロング名を使用する必要があります(例:
[12]
ではなく、[Ounces_12]
)。 -
-
メンバー名の接頭辞として、ディメンション名、またはいずれかの祖先メンバー名を指定します(例:
[Product].[100-10]
および[Diet].[100-10]
)。あいまいさが排除され、共有メンバーを正確に参照できるようになるため、すべてのメンバー名についてこのようにすることをお薦めします。参照: 祖先の区別によるメンバーの修飾ノート:
メンバー名の修飾には複数の祖先を使用しないでください。複数の祖先が含まれる場合、Essbaseによってエラーが戻されます。たとえば、
[Market].[New York]
と[East].[New York]
はNew Yorkの有効な名前ですが、[Market].[East].[New York]
を指定するとエラーが戻されます。 -
WITHセクションで定義されている計算済メンバーの名前を指定します。
演習2: 1つ目の問合せの実行
問合せテンプレートの2行目にある中カッコ{}
はセットのプレースホルダであることを思い出してください。この演習では、問合せにセットを追加して、実行します。
問合せを実行するには:
-
「MDX問合せテンプレートの作成」で作成した問合せテンプレートである、
qry_blank.txt
を開きます。 -
セットは1つのタプルと同程度に単純化できるため、セットを保持する中カッコ
{ }
内にタプルを追加します。2行目にある中カッコ
{ }
の内側に[Jan]
と入力します。SELECT {[Jan]} ON COLUMNS FROM Sample.Basic
-
qry_first.txt
として問合せを保存します。 -
Essbaseが実行されていることを確認します。
-
MaxLクライアントを起動し、有効なユーザー名とパスワードでログオンします。例:
login admin1 my_Pa55w0rD on "https://myserver.example.com:9001/essbase/agent";
-
SELECT問合せ全体をコピーしてMaxLクライアントに貼り付けますが、まだ[Enter]は押さないでください。
-
Basicの後で、[Enter]を押す前に、最後にセミコロンを入力します。(セミコロンはMDXの要件ではありませんが、MaxLクライアントでは文の終了を示すために必要です)。
-
[Enter]を押して問合せをEssbaseに送信します。
結果は次のようになります。
Jan 8024
軸とキューブの指定があるMDX問合せレイアウト
MDX軸は、Essbaseキューブからの問合せ結果のグリッド・レイアウトを形成する指示です。ON COLUMNSおよびON ROWSは、結果が表示される場所を示す軸キーワードです。キューブ指定は、FROMキーワードを含んでおり、どのキューブを問い合せるかをEssbaseに指示します。
MDX軸
軸は、Selectの後にMDX問合せに収まります。
SELECT <axis> [, <axis>...]
FROM <database>
次の問合せでは、軸の指定は{Jan} ON COLUMNS
です。
SELECT
{Jan} ON COLUMNS
FROM Sample.Basic
MDX問合せには、少なくとも1つの軸を指定する必要があります。
軸は、AXIS(0)からAXIS(1)...AXIS(63)と続けて、64個まで指定できます。一般的に、軸を4つ以上使用することはありません。軸の順序は重要ではありませんが、0からnまでの一連の軸を指定するとき、0とnの間の軸をスキップしないでください。また、1つのディメンションが複数の軸上に出現することはできません。
次の表に示すように、最初の5つの軸にはキーワード別名があります。
表29-1 軸のキーワード別名
軸のキーワード別名 | 軸 |
---|---|
ON COLUMNS |
AXIS(0)のかわりに使用可能 |
ON ROWS |
AXIS(1)を置換え可能 |
ON PAGES |
AXIS(2)を置換え可能 |
ON CHAPTERS |
AXIS(3)を置換え可能 |
ON SECTIONS |
AXIS(4)を置換え可能 |
MDXキューブ指定
キューブ指定は、問合せ対象のEssbaseデータベースを決定する、問合せの部分です。キューブの指定は、次のようにMDX問合せに配置します。
SELECT <axis> [, <axis>...]
FROM <cube>
<cube>セクションはFROMキーワードの後に置き、最初にアプリケーション名、次にデータベース名を指定する識別子(区切っても区切らなくても可)を含めます。たとえば、次の指定は有効です。
-
FROM Sample.Basic
-
FROM [Sample.Basic]
-
FROM [Sample].[Basic]
-
FROM'Sample'.'Basic'
演習3: 2軸問合せの実行
2軸問合せを実行するには:
-
「MDX問合せテンプレートの作成」で作成した問合せテンプレートである、
qry_blank.txt
を開きます。 -
ON COLUMNS
の後ろにカンマを追加してから、ON ROWS
を追加することで2番目の軸のプレースホルダを追加します。SELECT {} ON COLUMNS, {} ON ROWS FROM Sample.Basic
-
qry_blank_2ax.txt
として新しい問合せテンプレートを保存します。 -
列軸のセットの指定として、Productメンバー100-10および100-20を入力します。例:
SELECT {[100-10],[100-20]} ON COLUMNS, {} ON ROWS FROM Sample.Basic
これらのメンバー名には特殊文字が含まれているため、大カッコを使用する必要があります。メンバー名に特殊文字が含まれていない場合でも、すべてのメンバー名を大カッコで囲むという、ここで使用されているルールに従うことをお薦めします。
-
行軸のセットの指定として、YearメンバーQtr1からQtr4までを入力します。
SELECT {[100-10],[100-20]} ON COLUMNS, {[Qtr1],[Qtr2],[Qtr3],[Qtr4]} ON ROWS FROM Sample.Basic
-
qry_2ax.txt
として問合せを保存します。 -
最初の演習(「MDXセットとタプル」内)の説明に従って、問合せをMaxLクライアントに貼り付け、実行します。
問合せの結果は次のようになります。
表29-2 結果: 2軸問合せの実行
![]() |
100-10 | 100-20 |
---|---|---|
Qtr1 |
5096 |
1359 |
Qtr2 |
5892 |
1534 |
Qtr3 |
6583 |
1528 |
Qtr4 |
5206 |
1287 |
演習4: 単一軸上での複数ディメンションの問合せ
単一軸上で複数のディメンションを問い合せるには:
-
前の演習で作成した問合せテンプレートである、
qry_blank_2ax.txt
を開きます。 -
列軸で、それぞれが1つのメンバーではなくメンバーの組合せである、2つのタプルを指定します。各タプルで複数のメンバーが表されるため、各タプルを丸カッコで囲みます。
SELECT {([100-10],[East]), ([100-20],[East])} ON COLUMNS, {} ON ROWS FROM Sample.Basic
-
行軸で、各QuarterおよびProfitをネストして、2つのメンバーを持つ4つのタプルを指定します。
SELECT {([100-10],[East]), ([100-20],[East])} ON COLUMNS, { ([Qtr1],[Profit]), ([Qtr2],[Profit]), ([Qtr3],[Profit]), ([Qtr4],[Profit]) } ON ROWS FROM Sample.Basic
-
qry_1ax.txt
として問合せを保存します。 -
最初の演習(「MDXセットとタプル」内)の説明に従って、問合せをMaxLクライアントに貼り付け、実行します。
結果は次のようになります。
表29-3 結果: 単一軸上での複数のディメンションの問合せ
100-10 100-20 East
East
Qtr1
Profit
2461
212
Qtr2
Profit
2490
303
Qtr3
Profit
3298
312
Qtr4
Profit
2430
287
MDX関数の使用によるセットの構築
演習を試すことで、MemberRange関数とCrossJoin関数の使用方法を学習します。
MDX関数のこの概要では、セットを生成するいくつかの関数に焦点を当てています。MDX問合せにメンバーごとまたはタプルごとにセットを手動入力するのではなく、このような列挙を単純な関数式に置き換えることができます。MDX関数では、セット、およびその他の値を返すことができます。
たとえば、Childrenはセット関数です。これは、入力メンバーの子メンバーのセットを返します。したがって、Children(Qtr1)
は{Jan, Feb, Mar}
を返します。
次の演習は、単純な問合せでのMDX関数の使用を学習するのに役立ちます。EssbaseでサポートされているMDX関数の完全なリファレンスは、MDX関数リストでリストされています。
演習5: MemberRange関数の使用
MemberRange MDX関数では、同世代の指定した2つのメンバーの間(これら2つのメンバーを含む)の範囲のメンバーが戻されます。構文は次のとおりです。
MemberRange (member1, member2, [,layertype])
ここで、指定する最初の引数は範囲の始まりとなるメンバーで、2番目の引数は範囲の終わりとなるメンバーです。layertype引数はオプションです。
ノート:
MemberRangeのもう1つの構文として、関数名を使用するかわりに、member1 :
member2.のように2つのメンバー間にコロンを使用する方法があります。
MemberRange関数を使用するには、次のようにします。
-
「MDX問合せテンプレートの作成」で作成した問合せテンプレートである、
qry_blank.txt
を開きます。 -
セットを戻す関数を使用するときは不要となる、中カッコ
{}
を削除します。 -
コロン演算子を使用して、Qtr1からQtr4までのメンバー範囲を選択します。
SELECT [Qtr1]:[Qtr4] ON COLUMNS FROM Sample.Basic
-
最初の演習(「MDXセットとタプル」内)の説明に従って、問合せをMaxLクライアントに貼り付け、実行します。
Qtr1、Qtr2、Qtr3およびQtr4が戻されます。
-
MemberRange関数を使用して、同じメンバー範囲であるQtr1からQtr4までを選択します。
SELECT MemberRange([Qtr1],[Qtr4]) ON COLUMNS FROM Sample.Basic
-
この問合せをMaxLクライアントに貼り付けて実行します。
-
問合せを
gry_member_range_func.txt
として保存します。
演習6: CrossJoin関数の使用
CrossJoin関数では、別々のEssbaseディメンションからの2つのセットのクロス積が戻されます。構文は次のとおりです。
CrossJoin(set,set)
この関数では、別々のディメンションからの2つのセットが入力として受け入れられ、それらのクロス積である1つのセットが作成されます。これは、対称レポートを作成する場合に役立ちます。
CrossJoin関数を使用するには、次のようにします。
-
「MDX問合せテンプレートの作成」で作成した問合せテンプレートである、
qry_blank.txt
を開きます。 -
列軸の中カッコ
{}
をCrossJoin()
に置き換えます。SELECT CrossJoin () ON COLUMNS, {} ON ROWS FROM Sample.Basic
-
CrossJoin関数に指定する2つのセット引数のプレースホルダとして、2つの中カッコ・ペアをカンマで区切って追加します。
SELECT CrossJoin ({}, {}) ON COLUMNS, {} ON ROWS FROM Sample.Basic
-
最初のセットには、製品のメンバー
[100-10]
を指定します。2番目のセットでは、Marketメンバー[East]
、[West]
、[South]
および[Central]
を指定します。SELECT CrossJoin ({[100-10]}, {[East],[West],[South],[Central]}) ON COLUMNS, {} ON ROWS FROM Sample.Basic
-
行軸でCrossJoinを使用して、メジャーのメンバーのセットと
Qtr1
が含まれるセットをクロスします。SELECT CrossJoin ({[100-10]}, {[East],[West],[South],[Central]}) ON COLUMNS, CrossJoin ( {[Sales],[COGS],[Margin %],[Profit %]}, {[Qtr1]} ) ON ROWS FROM Sample.Basic
-
問合せを
qry_crossjoin_func.txt
として保存します。 -
この問合せをMaxLクライアントに貼り付けて実行します。
CrossJoinの使用を試みる場合は、引数の順序が出力でのタプルの順序に影響することに注意してください。
問合せの結果を次に示します。
表29-4 結果: CrossJoin関数の使用
![]() |
![]() |
100-10 | 100-10 | 100-10 | 100-10 |
---|---|---|---|---|---|
![]() |
![]() |
East |
West |
South |
Central |
Sales |
Qtr1 |
5731 |
3493 |
2296 |
3425 |
COGS |
Qtr1 |
1783 |
1428 |
1010 |
1460 |
Margin % |
Qtr1 |
66.803 |
59.118 |
56.01 |
57.372 |
Profit % |
Qtr1 |
45.82 |
29.974 |
32.448 |
24.613 |
ノート:
入力セットが基本ディメンションとその属性ディメンションの場合は、CrossJoinAttributeを使用することを検討してください。
演習7: Children関数の使用
Children関数では、特定のメンバーのすべての子メンバーのセットが戻されます。次の構文を使用します。
Children (member)
ノート:
Childrenの別の構文として、これを入力メンバーの演算子として使用する方法があります(例: member.Children)。この演習では、この演算子構文を使用します。
Children関数を使用して、最初の軸指定にショートカットを導入するには、次のようにします。
-
前の演習で作成した問合せである、
qry_crossjoin_func.txt
を開きます。 -
列軸指定の2番目のセットで、
[East],[West],[South],[Central]
を[Market].Children
に置き換えます。SELECT CrossJoin ({[100-10]}, {[Market].Children}) ON COLUMNS, CrossJoin ( {[Sales],[COGS],[Margin %],[Profit %]}, {[Qtr1]} ) ON ROWS FROM Sample.Basic
-
問合せを
gry_children_func.txt
として保存します。 -
この問合せをMaxLクライアントに貼り付けて実行します。
前にCrossjoinの演習で戻されたのと同じ結果が戻されます。
MDXによるレベルと世代の参照
一部のMDX関数では、入力のlayer引数に基づいてセット操作が実行されます。このlayerは、Essbaseディメンションの世代またはレベルを表しています。Members関数を使用してセットを参照する方法について学習します。
MDXでは、レイヤーという概念は、Essbase階層での世代とレベルを意味しています。
Essbaseでは、世代番号のカウントは、ディメンション名を1として開始され、世代番号が大きいほど階層内のリーフ・メンバーに近くなります。
レベル番号は、階層の最もリーフ側に近い部分を0として開始され、ディメンション名のレベル番号が最も大きくなります。
レイヤー引数を指定する方法は、次のとおりです。
-
世代名またはレベル名。たとえば、
States
やRegions
。 -
世代名またはレベル名を伴うディメンション名。たとえば、
Market.Regions
や[Market].[States]
。 -
入力としてディメンションとレベル番号を使用するLevels関数。たとえば、
[Year].Levels(0)
。 -
入力としてメンバーを使用するLevel関数。たとえば、
[Qtr1].Level
は、Marketディメンションのレベル1であるSample.Basicの四半期のレベルを戻します。 -
入力としてディメンションと世代番号を使用するGenerations関数。たとえば、
[Year].Generations
(3)
。 -
入力としてメンバーを使用するGeneration関数。たとえば、
[Qtr1].Generation
は、Marketディメンションの世代2であるSample.Basicの四半期の世代を戻します。
ノート:
Sample.Basicデータベースでは、Qtr1とQtr4は同じレイヤーにあります。つまり、Qtr1とQtr4は同じ世代にも属します。ただし、不規則階層を持つ別のデータベースでは、Qtr1とQtr4は、同じ世代に属していても、必ずしも同じレベルにあるとは限りません。たとえば、Qtr1の階層が週にドリルダウンし、Qtr4の階層が月で止まる場合、Qtr1は、Qtr4よりも1レベル高くなりますが、その場合でもこれらは同じレイヤーにあります。
演習8: Members関数の使用
指定した世代またはレベルのすべてのメンバーを戻すには、Members関数を使用します。この構文をlayer引数とともに使用すると、次のようになります。
Members (
layer)
ここで、layer引数は、戻されるメンバーの世代またはレベルを示します。
ノート:
Membersの別の構文は、layer.Members
です。
Members関数を使用するには:
-
「MDX問合せテンプレートの作成」で作成した問合せテンプレートである、
qry_blank.txt
を開きます。 -
セットを戻す関数を使用するときは不要となる、中カッコ
{}
を削除します。 -
Members関数とLevels関数を使用して、Sample.BasicのMarketディメンションのすべてのレベル0のメンバーを選択します。
SELECT Members(Market.levels(0)) ON COLUMNS FROM Sample.Basic
-
qry_members_func.txt
として問合せを保存します。 -
最初の演習(「MDXセットとタプル」内)の説明に従って、問合せをMaxLクライアントに貼り付け、実行します。
結果: Marketディメンションのすべての州が戻されます。
スライサ軸の使用によるMDX問合せの視点の設定
スライサ軸は、Essbaseキューブの特定の領域のみを考慮するようにMDX問合せを制限する方法です。サンプル演習を試すことで、WHERE句でスライサを使用する方法について学習します。
スライサは、使用する場合は、MDX問合せのWHEREセクションで指定する必要があります。また、WHEREセクションは、キューブ指定(FROMセクション)の後に置き、問合せの最後の構成要素にする必要があります。
SELECT {set}
ON axes
FROM cube
WHERE slicer
スライサ軸を使用して、問合せのコンテキストを設定します。これは通常、他のすべての軸のデフォルトのコンテキストです。
Sample.Basicキューブ内の売上実績のみ(売上予算を除く)を選択する場合、WHERE句は次のようになります。
WHERE ([Actual], [Sales])
スライサ軸に(Actual, Sales)が指定されているため、ON AXIS(n)のセット指定にそれらを含める必要はありません。
ノート:
同じディメンションを他の軸とスライサ軸に表示することはできません。軸をそれ固有のディメンションからの基準を使用してフィルタ処理するには、副選択を使用します。
演習9: スライサ軸による結果の制限
スライサ軸を使用して結果を制限するには:
-
「MDX関数の使用によるセットの構築」の演習6で作成した問合せである、
gry_crossjoin_func.txt
を開きます。 -
最初の演習(「MDXセットとタプル」内)の説明に従って、問合せをMaxLクライアントに貼り付け、実行します。
データ・セルの1つに表示される結果に注目してください。最初のタプル
([Cola],[East],[Sales],[Qtr1])
の値は、5731です。 -
戻されるデータを予算値のみに制限するために、スライサ軸を追加します。
SELECT CrossJoin ({[100-10]}, {[East],[West],[South],[Central]}) ON COLUMNS, CrossJoin ( {[Sales],[COGS],[Margin %],[Profit %]}, {[Qtr1]} ) ON ROWS FROM Sample.Basic WHERE (Budget)
-
この問合せをMaxLクライアントに貼り付けて実行します。
-
タプル
([Cola],[East],[Sales],[Qtr1])
の値が5020になったことに注目してください。 -
この問合せを
qry_slicer_axis.txt
という名前で保存します。
一般的なMDX関係関数
MDX関係関数では、Essbaseキューブ・アウトラインでの階層メンバー関係に基づいてセットまたはメンバーが戻されます。
次のMDX関係関数では、セットが戻されます。
表29-5 セットを戻すMDX関係関数のリスト
関係関数 | 説明 |
---|---|
入力メンバーの子が戻されます。 |
|
入力メンバーの兄弟が戻されます。 |
|
様々なオプションでメンバーの子孫が戻されます。 |
次のMDX関係関数では、セットではなく単一メンバーが戻されます。
表29-6 単一メンバーを戻すMDX関係関数のリスト
関係関数 | 説明 |
---|---|
指定したレイヤーに存在する祖先が戻されます。 |
|
別の祖先のメンバーと同じ位置の子メンバーが戻されます。 |
|
入力メンバーの親が戻されます。 |
|
入力メンバーの最初の子が戻されます。 |
|
入力メンバーの最後の子が戻されます。 |
|
入力メンバーの親の最初の子が戻されます。 |
|
入力メンバーの親の最後の子が戻されます。 |
演習10: ドキュメントにある関係関数の例をいくつか試す
関係関数の仕組みを学習するには:
-
上の表のいずれかで関数へのリンクをクリックするか、「Children」をクリックします。
-
例を読み、SELECT問合せをクリップボードにコピーします。
-
最初の演習(「MDXセットとタプル」内)の説明に従って、問合せをMaxLクライアントに貼り付け、終了のセミコロンを追加し、問合せを実行します。
セット操作のMDX関数
次のセット関数は、キューブから詳細情報を導出しないで入力セットを操作します。
表29-7 純粋なセット関数のリスト
純粋なセット関数 | 説明 |
---|---|
異なるディメンションの2つのセットがクロスする部分を戻します。 |
|
セットから重複するタプルを削除します。 |
|
2つのセットの差分を含むサブセットを戻します。 |
|
反復関数。set1のタプルごとにset2を戻します。 |
|
セット内の先頭のn個のメンバーまたはタプルを戻します。 |
|
2つの入力セットの交差を戻します。 |
|
セットからサブセットを戻します。サブセットは、数値で指定されたタプルの範囲です。 |
|
セット内の最後のn個のメンバーまたはタプルを戻します。 |
|
2つの入力セットの和集合を戻します。 |
演習11: Intersect関数の使用
MDXのIntersect関数では、2つの入力セットの交差が戻されます(オプションで、重複が保持されます)。これを使用して、両方のセットに存在するタプルを検索することでセットを比較します。
この構文は次のとおりです。
Intersect (set, set [,ALL])
-
「MDX問合せテンプレートの作成」で作成した問合せテンプレートである、
qry_blank.txt
を開きます。 -
軸から空のセットの中カッコ
{}
を削除し、それらをIntersect()
に置き換えます。コードをさらに追加するために、Intersectの中カッコ内にスペースを残します。例:SELECT Intersect ( ) ON COLUMNS FROM Sample.Basic
-
Intersect関数に指定する2つのセット引数のプレースホルダとして使用するために、中カッコの2つのペアをカンマで区切って追加します。例:
SELECT Intersect ( { }, { } ) ON COLUMNS FROM Sample.Basic
-
最初のセット引数としてEastの子を指定します。例:
SELECT Intersect ( { [East].children }, { } ) ON COLUMNS FROM Sample.Basic
-
2番目のセット引数として、Major MarketのUDAを持つMarketディメンションのすべてのメンバーを指定します。例:
SELECT Intersect ( { [East].children }, { UDA([Market], "Major Market") } ) ON COLUMNS FROM Sample.Basic
-
最初の演習(「MDXセットとタプル」内)の説明に従って、問合せをMaxLクライアントに貼り付け、実行します。
Major MarketのUDAを持つEastのすべての子が戻されます。例:
New York Massachusetts Florida 8202 6172 5029
-
この問合せを
qry_intersect_func.txt
という名前で保存します。
演習12: Union関数の使用
MDXのUnion関数では、2つの入力セットが結合されます(オプションで、重複が保持されます)。これを使用して、2つのセットを結合して1つのセットにします。
この構文は次のとおりです。
Union (set, set [,ALL])
-
前の演習で作成した問合せである、
qry_intersect_func.txt
を開きます。 -
IntersectをUnionに置き換えます。
-
この問合せを
qry_union_func.txt
という名前で保存します。 -
この問合せをMaxLクライアントに貼り付けて実行します。
Intersectでは、Major MarketのUDAがある、Eastの子のみを含むセットが戻されますが、Unionでは、より大きなセットが戻されます。これには、Eastのすべての子と、Major MarketのUDAがあるすべてのMarketメンバーが含まれます。
(New York) (Massachusetts) (Florida) (Connecticut) (New Hampshire) (East) (California) (Texas) (Central) (Illinois) (Ohio) (Colorado) +---------------+---------------+---------------+---------------+---------------+---------------+---------------+---------------+---------------+---------------+---------------+--------------- 8202 6712 5029 3093 1125 24161 12964 6425 38262 12577 4384 7227
再利用可能なセットとメンバー: MDXのWITHセクション
MDX問合せのWITHセクションでメンバーとセットを定義すると、キューブに影響を与えずにデータをフィルタ処理するのに役立ちます。計算済メンバーは、問合せ内にのみ存在する論理メンバーです。名前付きセットは、問合せ内にのみ存在する論理セットです。サンプル演習を試してください。
計算済メンバーと名前付きセットは、問合せの存続期間中に複数回使用できる、問合せ内の論理エンティティです。計算済メンバーと名前付きセットによって、記述されたコードの行および実行時間で時間を節約できます。MDX問合せの先頭に置くオプションのWITHセクションでは、計算済メンバーまたは名前付きセット、あるいはその両方を定義できます。
次の問合せでは、計算済メンバーが使用されています。
WITH
MEMBER [Measures].[Max Qtr2 Sales] AS
'Max (
{[Year].[Qtr2]},
[Measures].[Sales]
)'
SELECT
{ [Measures].[Max Qtr2 Sales] } on columns,
{ [Product].children } on rows
FROM Sample.Basic
次の問合せでは、名前付きセットが使用されています。
WITH SET [NewSet]
AS 'CrossJoin([Product].Children, [Market].Children)'
SELECT
Filter([NewSet], NOT IsEmpty([NewSet].CurrentTuple))
ON COLUMNS
FROM Sample.Basic
WHERE
{[Sales]}
計算済メンバー
計算済メンバーとは、問合せの実行期間中に存在する仮想メンバーです。計算済メンバーを使用すると、物理メンバーをキューブ・アウトラインに追加せずに、複雑な分析を行うことができます。計算済メンバーには、物理メンバーに対して実行された計算結果が格納されます。
計算済メンバーの名前には次のガイドラインを使用します。
-
計算済メンバーはディメンションに関連付けます。たとえば、メンバーMyCalcをMeasuresディメンションに関連付けるには、
[Measures].[MyCalc]
という名前を付けます。 -
実際のメンバーの名前を使用して計算済メンバーに名前を付けないでください。たとえば、SalesはすでにMeasuresディメンションに存在するため、計算済メンバーに
[Measures].[Sales]
という名前を付けないでください。
複数の計算済メンバーを使用して比率またはカスタム合計を作成する場合は、各計算済メンバーに解決順を設定することをお薦めします。
名前付きセット
問合せのSELECT部分の前に、WITH SETキーワードを使用して名前付きセットを定義します。これを行うと、問合せのSELECT部分を構築するときにセットを名前で参照できるため便利です。
たとえば、名前付きセットBest5Prods
は、12月に最もよく売れている5つの製品のセットを識別します。
WITH
SET [Best5Prods]
AS
'Topcount (
[Product].members,
5,
([Measures].[Sales], [Scenario].[Actual], [Year].[Dec])
)'
SELECT [Best5Prods] ON AXIS(0),
{[Year].[Dec]} ON AXIS(1)
FROM Sample.Basic
演習13: 計算済メンバーの作成
この演習では、計算の共通MDX関数であるMax関数を使用します。これは、セットのタプル内で見つかった最大値を戻します。
この構文は次のとおりです。
Max (set, numeric_value)
-
「軸とキューブの指定があるMDX問合せレイアウト」の演習3で作成した問合せテンプレートである、
qry_blank_2ax.txt
を開きます。SELECT {} ON COLUMNS, {} ON ROWS FROM Sample.Basic
-
行軸のセットでProductの子を指定します。例:
SELECT {} ON COLUMNS, {[Product].children} ON ROWS FROM Sample.Basic
-
問合せの先頭に、計算済メンバーの指定のプレースホルダを追加します。例:
WITH MEMBER [].[] AS '' SELECT {} ON COLUMNS, {[Product].children} ON ROWS FROM Sample.Basic
-
計算済メンバーをMeasuresディメンションに関連付け、Max Qtr2 Salesという名前にするには、この情報を計算済メンバーの指定に追加します。例:
WITH MEMBER [Measures].[Max Qtr2 Sales] AS '' SELECT {} ON COLUMNS, {[Product].children} ON ROWS FROM Sample.Basic
-
ASキーワードの後の一重引用符の内側に、Max Qtr2 Salesという名前の計算済メンバーのロジックを定義します。
Max関数で、セットを使用して(Qtr2)を最初の引数として評価し、メジャーを使用して(Sales)を2番目の引数として評価します。例:
WITH MEMBER [Measures].[Max Qtr2 Sales] AS ' Max ( {[Year].[Qtr2]}, [Measures].[Sales] )' SELECT {} ON COLUMNS, {[Product].children} ON ROWS FROM Sample.Basic
-
計算済メンバーMax Qtr2 Salesは、WITHセクションに定義されています。それを問合せで使用するには、問合せのSELECT部分にある軸のいずれかでそれを参照します。例:
WITH MEMBER [Measures].[Max Qtr2 Sales] AS ' Max ( {[Year].[Qtr2]}, [Measures].[Sales] )' SELECT {[Measures].[Max Qtr2 Sales]} ON COLUMNS, {[Product].children} ON ROWS FROM Sample.Basic
-
この問合せを
gry_calc_member.txt
という名前で保存します。 -
最初の演習(「MDXセットとタプル」内)の説明に従って、問合せをMaxLクライアントに貼り付け、実行します。
問合せの結果を次に示します。
表29-8 結果: 計算済メンバーの作成
Max Qtr2 Sales 100
27187
200
27401
300
25736
400
21355
Diet
26787
ノート:
MDXリファレンス・ドキュメントには、さらに多くの例があります。MDXのWithセクションを参照してください。
反復MDX関数
反復MDX関数では、Essbaseキューブ内のデータの複数セットにわたりループして、結果を調整するために指定した検索条件を実行します。ブール・テストに基づいてデータをフィルタ処理する例を参照してください。
Filter関数の例
次の問合せでは、MDXのFilter関数を使用して、式IsChild([Market].CurrentMember,[East])
でTRUE
が戻されるMarketディメンション・メンバーがすべて戻されています。この問合せでは、Eastの子がすべて戻されます。
SELECT
Filter([Market].Members,
IsChild([Market].CurrentMember,[East])
)
ON COLUMNS
FROM Sample.Basic
MDXのFilter関数は、レポート・ライターでのRESTRICTコマンドに相当します。
MDXによる欠落データの処理
MDXを使用してEssbaseキューブを問い合せるときは、軸でNON EMPTYキーワードを使用して、値を含まないセルを抑制できます。欠落値を処理するMDX関数としては、Avg、CoalesceEmpty、IsEmpty、NonEmptyCountおよびNonEmptySubsetがあります。NONEMPTYMEMBERプロパティとNONEMPTYTUPLEプロパティは、大きいデータ・セットから空の値をフィルタで除外するのに役立ちます。
軸でのセットの指定の前にオプションのキーワードNON EMPTYを指定すると、この軸で#MISSING値全体を含むスライスが抑制されます。
NON EMPTYを含む軸の指定の構文は、次のとおりです。
<axis_specification> ::=
[NON EMPTY] <set> ON
COLUMNS | ROWS | PAGES | CHAPTERS |
SECTIONS | AXIS (<unsigned_integer>)
軸上のタプル((Qtr1,
Actual)
など)については、スライスは、そのタプルと他のすべての軸のすべてのタプルの組合せで構成されるセルで構成されます。これらのセルの値がすべて#MISSINGの場合、NON EMPTYキーワードによってそのタプルが消去されます。
たとえば、行のいずれの値も空でない場合は、その行全体が戻されます。行軸の指定の先頭にNON EMPTYを指定すると、問合せで戻されるセットから次の行スライスが消去されます。

NON EMPTYを使用して欠落値を抑制することに加えて、次のMDX関数を使用して、#MISSINGの結果を処理できます。
-
CoalesceEmpty: 数値式から#MISSING以外の値を検索します
-
IsEmpty: 入力の数値式の値が#MISSINGに評価される場合にTRUEを戻します
-
Avg: オプションのIncludeEmptyフラグが使用されていない場合に平均から欠落値を省略します
MDXのNonEmptyCount関数では、#Missing以外の値に評価された、セット内のタプルの数のカウントが戻されます。それぞれのタプルが評価されて、この関数によって戻されるカウントに含まれます。数値式が指定される場合は、すべてのタプルのコンテキストで評価されて、#Missing以外の値のカウントが戻されます。
集約ストレージ・キューブでのみ、NonEmptyCount関数が最適化されるため、1回のみのキューブのスキャンで、すべてのセルの重複を除去したカウントの計算を実行できます。この最適化がない場合、データベースがスキャンされる回数が、重複を除去したカウントに対応するセルの数と同じになります。アウトライン・メンバー式に次の構文がある場合、NonEmptyCount最適化がトリガーされます。
NONEMPTYCOUNT(set, measure, exclude_missing)
exclude_missingパラメータは、重複を除去したカウントの計算を実行するメトリックを問い合せる、問合せのパフォーマンスを改善することで、集約データベースでのNonEmptyCount最適化をサポートします。
MDXでNONEMPTYMEMBERおよびNONEMPTYTUPLE最適化プロパティを使用すると、メンバーまたはタプルの大規模なセットに対して問合せを実行できることに加えて、#MISSINGデータのみが含まれた、使用しない値での式の実行をスキップできます。
-
nonempty_member_listで指定されたメンバーのいずれかが空の場合に、式または計算済メンバーの値が空であることをEssbaseに通知するには、計算済メンバーまたは数式の先頭でNONEMPTYMEMBERプロパティ句を単独で使用します。
-
nonempty_member_listで指定されたタプルのセル値が空の場合に、式または計算済メンバーの値が空であることをEssbaseに通知するには、計算済メンバーまたは数式の先頭でNONEMPTYTUPLEプロパティ句を単独で使用します。
入力セットが指定されている場合、MDXのNonEmptySubset関数では、すべてのタプルで空ではないと評価された、その入力セットのサブセットが戻されます。空でないことを確認するために、オプションの値式を指定できます。この関数は、空でない組合せのセットが小規模であることがわかっている大規模なセットに基づいた問合せの最適化に役立つことがあります。NonEmptySubsetを使用すると、メトリックが存在する場合にセットのサイズが減少します。たとえば、特定のUnitsに対して空でない子孫のサブセットを要求できます。
MDX問合せでの変数
MDXで、事前定義済のEssbase代替変数を使用すると、問合せを変更せずに、頻繁に変更される情報を参照できます。MDX問合せまたは式で変数を参照するには、前にアンパサンド(&)が付いた変数名を入力します。
Essbaseでの代替変数は、定期的に変更される情報のためのプレースホルダとして機能します。Essbaseキューブ、アプリケーションまたはグローバル・レベルで代替変数を設定し、各変数に値を割り当てます。値はいつでも変更できます。代替変数を設定するにはデータベース・マネージャ以上の役割が必要です。代替変数の使用方法を参照してください。
MDX式で代替変数を使用する場合は、次の点に注意してください。
-
代替変数は、問い合せるアプリケーションおよびキューブからアクセス可能である必要があります。
-
代替変数は、名前と値の2つのコンポーネントで構成されます。
-
変数名は英数字の組合せであり、最大サイズは名前および関連アーティファクトの制限で指定されています。MDXで使用する代替変数名には、スペース、句読点または大カッコ([ ])を使用しないでください。
-
式の中では、変数を使用する場所で、変数名の前にアンパサンド(&)を付けて入力します。たとえば、サーバー上に設定した代替変数の名前が
CurMonth
である場合、MDX式には、&CurMonth
を含めます。 -
取得を実行すると、Essbaseによって変数名が代替値に置換されて、MDX式ではこの値が使用されます。
たとえば、次のように変数名CurQtr
の先頭に&を付けた式を作成します。
SELECT
{[&CurQtr]}
ON COLUMNS
FROM Sample.Basic
この式が評価されると、変数名が現在の値(Qtr1)に置換されるので、実行される式が効率的になります。
SELECT
{[Qtr1]}
ON COLUMNS
FROM Sample.Basic
MDXでのプロパティの問合せ
プロパティにより、Essbaseのデータとメタデータの特定の特性を記述します。MDXでは、Essbaseのプロパティ(固有またはカスタム)に基づいてデータを取得および分析する問合せを記述できます。MDX問合せの軸、または値式でプロパティを呼び出すことができます。
固有プロパティとカスタム・プロパティ
MDXでは、プロパティでデータとメタデータの特性を記述します。MDXでは、プロパティを使用してデータを取得および分析する問合せを記述できます。プロパティは、組込みかカスタムのいずれかです。
固有プロパティ
組込みプロパティは、すべてのディメンションのメンバーに対して定義されています。Essbaseのデータベース・アウトラインのすべてのメンバーに対して定義されている組込みメンバー・プロパティは、MEMBER_NAME、MEMBER_ALIAS、LEVEL_NUMBER、GEN_NUMBER、IS_EXPENSE、COMMENTSおよびMEMBER_UNIQUE_NAMEです。
それぞれの説明は、MDXの固有プロパティを参照してください。
カスタム・プロパティ
EssbaseのMDXは、属性プロパティとUDAプロパティという2種類のカスタム・プロパティをサポートしています。属性プロパティは、アウトラインで属性ディメンションによって定義します。Sample.BasicデータベースのPkg Type属性ディメンションは、Productディメンションのメンバーの容器特性を表しています。この情報は、プロパティ名[Pkg Type]を使用してMDXで問い合せることができます。
属性プロパティは、特定のディメンションに対してのみ、および各ディメンションの特定のレベルに対してのみ定義されます。たとえば、Sample.Basicアウトラインでは、[Ounces]
は、Productディメンションのメンバーに対してのみ定義された属性プロパティで、このプロパティにはProductディメンションのレベル0メンバーにのみ有効な値が設定されます。[Ounces]プロパティは、Marketなどの他のディメンションにはありません。Productディメンションの非レベル0メンバーの[Ounces]プロパティは、NULL値です。アウトラインの属性プロパティは、そのアウトラインにある属性ディメンションの名前で識別されます。
カスタム・プロパティにはUDAもあります。たとえば、[Major Market]は、Marketディメンションのメンバーに対して定義されたUDAプロパティです。[Major Market] UDAがメンバーに対して定義されている場合はTRUE値が返され、それ以外の場合はFALSEが返されます。
MDXのカスタム・プロパティも参照してください。
問合せ軸でのプロパティの呼出し
軸セットごとにディメンションとプロパティの組合せをリストできます。問合せを実行すると、指定したプロパティが、指定したディメンションのすべてのメンバーに対して評価され、結果セットに追加されます。
たとえば、次の問合せによって、列軸ではMarketディメンションのすべてのメンバーのGEN_NUMBER情報が返されます。行軸では、問合せによってProductディメンションのすべてのメンバーのMEMBER_ALIAS情報が返されます。
SELECT
[Market].Members
DIMENSION PROPERTIES [Market].[GEN_NUMBER] on columns,
Filter ([Product].Members, Sales > 5000)
DIMENSION PROPERTIES [Product].[MEMBER_ALIAS] on rows
FROM Sample.Basic
軸のDIMENSION PROPERTIESセクションを使用してメンバー・プロパティを問い合せる場合、プロパティは、ディメンション名とプロパティ名で識別することも、プロパティ名のみを使用して識別することもできます。プロパティ名のみを使用した場合、そのプロパティが適用される、その軸上のすべてのディメンションのすべてのメンバーに関して、対応するプロパティ情報が返されます。
次の問合せでは、MEMBER_ALIASプロパティは、YearディメンションとProductディメンションに関して行軸で評価されます。
SELECT [Market].Members
DIMENSION PROPERTIES [Market].[GEN_NUMBER] on columns,
CrossJoin([Product].Children, Year.Children)
DIMENSION PROPERTIES [MEMBER_ALIAS] on rows
FROM Sample.Basic
値式でのプロパティの呼出し
プロパティは、MDX問合せの値式の内部で使用できます。たとえば、入力セットのメンバーのプロパティを使用する値式に基づいて、セットをフィルタできます。
次の問合せでは、パッケージが缶のすべてのカフェイン入り製品が返されます。
SELECT
Filter([Product].levels(0).members,
[Product].CurrentMember.Caffeinated and
[Product].CurrentMember.[Pkg Type] = "Can")
Dimension Properties
[Caffeinated], [Pkg Type] on columns
FROM Sample.Basic
次の問合せでは、UDA [Major Market]を使用して、現在のMarketが主要な市場であるかどうかに基づいて値[BudgetedExpenses]が計算されます。
WITH
MEMBER [Measures].[BudgetedExpenses] AS
'IIF([Market].CurrentMember.[Major Market],
[Marketing] * 1.2, [Marketing])'
SELECT {[Measures].[BudgetedExpenses]} ON COLUMNS,
[Market].Members ON ROWS
FROM Sample.Basic
WHERE ([Budget])
プロパティの値タイプ
EssbaseのMDXプロパティの値タイプは、数値、ブール、文字列のいずれかです。MEMBER_NAMEプロパティとMEMBER_ALIASプロパティでは、文字列値が返されます。LEVEL_NUMBERプロパティとGEN_NUMBERプロパティでは、数値が返されます。
属性プロパティによって、属性ディメンション・タイプに基づいて、数値、ブール値、文字列値のいずれかが返されます。たとえば、Sample.Basicの[Ounces]属性プロパティは、数値プロパティです。[Pkg Type]属性プロパティは、文字列プロパティです。[Caffeinated]属性プロパティは、ブール・プロパティです。
Essbaseでは、属性ディメンションに日付型を使用できます。日付型プロパティは、MDXでは数値プロパティとして処理されます。これらのプロパティ値を日付と比較するときには、Todate関数を使用して、比較する前に日付文字列を数値に変換します。
次の問合せでは、2018年3月25日に発売されたProductディメンションのすべてのメンバーが返されます。プロパティ[Intro Date]は日付型であるため、比較を行う前にTODATE関数を使用して、日付の文字列「03-25-2018」を数値に変換する必要があります。
SELECT
Filter ([Product].Members,
[Product].CurrentMember.[Intro Date] =
TODATE("mm-dd-yyyy","03-25-2018"))ON COLUMNS
FROM Sample.Basic
プロパティを値式で使用する場合は、その値の型(文字列、数値またはブール)に基づいて適切にプロパティを使用する必要があります。
数値の範囲を持つ属性ディメンションを問い合せることもできます。
次の問合せでは、Small、MediumおよびLargeという人口範囲のSalesデータが取得されます。
SELECT
{Sales} ON COLUMNS,
{Small, Medium, Large} ON ROWS
FROM Sample.Basic
値式で属性をプロパティとして使用する場合は、範囲メンバーを使用して、メンバーのプロパティ値が特定の範囲内であるかどうかを確認できます。この場合はIN演算子を使用します。
たとえば、次の問合せでは、人口範囲がMediumであるMarketディメンションのすべてのメンバーが返されます。
SELECT
Filter(
Market.Members, Market.CurrentMember.Population
IN "Medium"
)
ON AXIS(0)
FROM Sample.Basic
NULLプロパティ値
すべてのメンバーが特定のプロパティ名に対して有効な値を持っているとは限りません。たとえば、MEMBER_ALIASプロパティを指定した場合、アウトラインに定義されているとおりに指定のメンバーの別名が返されます。ただし、すべてのメンバーに別名が定義されているとは限りません。この場合、別名が定義されていないメンバーに関してはNULL値が返されます。
次の問合せを見てください。
SELECT
[Year].Members
DIMENSION PROPERTIES [MEMBER_ALIAS]
ON COLUMNS
FROM Sample.Basic
Yearディメンションのどのメンバーにも別名が定義されていません。したがって、問合せでは、YearディメンションのメンバーのMEMBER_ALIASプロパティに関してNULL値が返されます。
属性プロパティは、特定のディメンションのメンバーおよびそのディメンションの特定のレベルに対して定義されます。Sample.Basicデータベースでは、[Ounces]プロパティは、Productディメンションのレベル0メンバーに対してのみ定義されています。
したがって、次の問合せに示すように、Marketディメンションのメンバーの[Ounces]プロパティを問い合せると、構文エラーとなります。
SELECT
Filter([Market].members,
[Market].CurrentMember.[Ounces] = 32) ON COLUMNS
FROM Sample.Basic
また、そのディメンションの非レベル0メンバーの[Ounces]プロパティを問い合せると、NULL値が返されます。
値式でプロパティ値を使用する場合、関数IsValid()を使用して、NULL値があるかどうかを確認できます。次の問合せでは、NULL値を持つメンバーを削除した後、[Ounces]プロパティ値が12である、Productディメンションのすべてのメンバーを返します。
SELECT
Filter([Product].Members,
IsValid([Product].CurrentMember.[Ounces]) AND
[Product].CurrentMember.[Ounces] = 12)
ON COLUMNS
FROM Sample.Basic