28 MDX問合せの書込み

MDXは、Essbaseからデータを取得する問合せを発行するために使用できるSQLに似た言語です。MDXは、ASOキューブに対する式の定義、メタデータの問合せ、メンバー名の修飾、データまたはメタデータのサブセットの記述にも使用されます。MDXを学習する最善の方法は、問合せを記述することです。

この項では、一連の演習でSample Basicキューブに対する問合せを記述してMDXの学習を支援します。

MDX問合せの記述の前提条件

演習を完了するには、次のものが必要です。

MDX問合せテンプレートの作成

MDX問合せの基本形式を学習し、EssbaseでMDXの使用を開始できるようにします。SQL文と同様に、MDX問合せは通常SELECTで始まります。

この項では、単純なMDX問合せを開発する基礎として使用するテンプレートを作成します。

ほとんどの問合せは、次の文法的フレームワークに基づいて作成できます。

SELECT
  {}
ON COLUMNS
FROM Sample.Basic

1行目でSELECTは、MDX文の本体を開始するキーワードである。

2行目の中カッコ{ }は、セットのプレースホルダになります。前述の問合せでは、セットは空ですが中カッコはプレースホルダのままです。

演習1: MDX問合せテンプレートの作成

問合せテンプレートを作成するには:

  1. Sample.Basicキューブに対して実行できるサンプルの問合せを格納するフォルダを作成します。

  2. テキスト・エディタを使用して、空白のファイルに次のコードを入力します。

    SELECT
      {}
    ON COLUMNS
    FROM Sample.Basic
  3. qry_blank.txtとしてファイルを保存します。

MDXセットおよびタプル

MDXセットにはタプルが含まれ、MDXタプルにはメンバー名が含まれます。セット、タプルおよびメンバー名の違いと、それらがEssbase MDX問合せにどのように適合するかについて学習します。

最初の問合せを記述し、MaxLクライアントで実行してSample Basicキューブからデータを取得します。

セット

MDXセットは空にすることも、タプルのコレクションにすることも、セットのコレクションにすることもできます。

たとえば、次は空のセットです。

{ }

セットは、 中カッコ{}で囲まれている必要があります(セットを戻すMDX関数にセットが表される場合を除く)。

次は、1つのタプルで構成されるセットです。


  {[Cola]}

次の問合せの{([Cola], [Actual])}も1つのタプルで構成されたセットですが、この場合のタプルのメンバー名は1つのメンバー名です。

SELECT
  {([Cola], [Actual])}
ON COLUMNS
FROM Sample.Basic

{([Cola], [Actual])}は、2つのディメンション(ProductおよびScenario)からの2つのメンバー(ColaおよびActual)で構成されるタプルです。

ディメンション・ルール

セットに複数のタプルがある場合、各タプルのメンバーは、同じ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")として指定することもできます。

    属性メンバーの場合、長い名前(メンバーを一意に識別するために修飾された)を使用する必要があります。たとえば、[Ounces_12][12]のかわりに使用します。

  • メンバー名の接頭辞として、ディメンション名、またはいずれかの祖先メンバー名を指定します(例: [Product].[100-10]および[Diet].[100-10])。あいまいさが排除され、共有メンバーを正確に参照できるようになるため、すべてのメンバー名についてこのようにすることをお薦めします。関連項目: アウトラインでの重複メンバー名の「祖先を区別して修飾されたメンバー」

    ノート:

    メンバー名の修飾には複数の祖先を使用しないでください。Essbaseは、複数の祖先が含まれている場合にエラーを返します。たとえば、[Market].[New York][East].[New York]はNew Yorkの有効な名前ですが、[Market].[East].[New York]を指定するとエラーが戻されます。

  • WITHセクションで定義された計算メンバーの名前を指定します。

演習2: 最初の問合せの実行

問合せテンプレートの2行目の中カッコ{}は、セットのプレースホルダであることを思い出してください。この演習では、問合せにセットを追加して、実行します。

問合せを実行するには:

  1. 「MDX問合せテンプレートの作成」で作成した問合せテンプレートであるqry_blank.txtを開きます。

  2. セットは1つのタプルと同じくらい単純であるため、セットを保持する中カッコ{ }内にタプルを追加します。

    Type [Jan] inside the { } braces in line 2:

    SELECT 
      {[Jan]}
    ON COLUMNS
    FROM Sample.Basic
  3. qry_first.txtとして問合せを保存します。

  4. Essbaseが実行されていることを確認します。

  5. MaxLクライアントを起動して、有効なユーザー名とパスワードでログインします。たとえば:

    login admin1 my_Pa55w0rD on "https://myserver.example.com:9001/essbase/agent";
  6. SELECT問合せ全体をコピーしてMaxLクライアントに貼り付けますが、まだ[Enter]は押さないでください。

  7. Basicの後で、[Enter]を押す前に、最後にセミコロンを入力します。(セミコロンはMDX要件ではありませんが、MaxL Clientが文の終わりを示すために必要となります)。

  8. [Enter]を押して、問合せをEssbaseに送信します。

    結果は次のようになります。

    Jan
      8024

軸とキューブ仕様のMDX問合せレイアウト

MDX軸は、Essbaseキューブからの問合せ結果のグリッド・レイアウトを形成する命令です。ON COLUMNSおよびON ROWSは、結果の表示場所を示す軸キーワードです。キューブ仕様にはFROMキーワードが含まれ、問い合せるキューブをEssbaseに指示します。

MDX軸

軸は、選択後にMDX問合せに収まります。

SELECT <axis> [, <axis>...]
FROM <database> 

次の問合せでは、軸の指定は{Jan} ON COLUMNSです。

SELECT
  {Jan} ON COLUMNS
FROM Sample.Basic

MDX問合せには、少なくとも1つの軸を指定する必要があります。

軸はAXIS(0)からAXIS(1)と続けて最大64個の軸を指定できます...AXIS(63)。一般に、軸を3つ以上使用することはありません。軸の順序は重要ではありませんが、0からnの一連の軸を指定するとき、0とnの間の軸をスキップしないでください。また、1つのディメンションが複数の軸上に出現することはできません。

次の表に示すように、最初の5つの軸にはキーワード別名があります。

表28-1軸のキーワード別名

軸のキーワード別名

オン列

AXIS(0)のかわりに使用可能

AXIS(1)を置換え可能

ページ上

AXIS(2)を置換え可能

チャプター

AXIS(3)を置換え可能

セクション

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軸問合せを実行するには:

  1. 「MDX問合せテンプレートの作成」で作成した問合せテンプレートであるqry_blank.txtを開きます。

  2. ON COLUMNSの後ろにカンマを追加してから、ON ROWSを追加することで2番目の軸のプレースホルダを追加します。

    SELECT
      {}
    ON COLUMNS,
      {}
    ON ROWS
    FROM Sample.Basic
  3. qry_blank_2ax.txtとして新しい問合せテンプレートを保存します。

  4. 列軸のセットの指定として、Productメンバー100-10および100-20を入力します。たとえば:

    SELECT
      {[100-10],[100-20]}
    ON COLUMNS, 
      {}
    ON ROWS
    FROM Sample.Basic

    これらのメンバー名には特殊文字が含まれているため、大カッコを使用する必要があります。メンバー名に特殊文字が含まれていない場合でも、すべてのメンバー名を大カッコで囲むという、ここで使用されているルールに従うことをお薦めします。

  5. 行軸のセットの指定として、YearメンバーQtr1からQtr4までを入力します。

    SELECT
      {[100-10],[100-20]}
    ON COLUMNS,
      {[Qtr1],[Qtr2],[Qtr3],[Qtr4]}
    ON ROWS
    FROM Sample.Basic
  6. qry_2ax.txtとして問合せを保存します。

  7. 最初の演習(「MDXセットおよびタプル」を参照)の説明に従って、MaxL Clientに問合せを貼り付け、実行します。

問合せの結果は次のようになります。

表28-2結果: 2軸問合せの実行

スペースのイメージが空のスレッド・セルに使用されます 100-10 100-20

Qtr1

5096

1359

Qtr2

5892

1534

Qtr3

6583

1528

Qtr4

5206

1287

演習4: 単一軸上での複数のディメンションの問合せ

単一軸上で複数のディメンションを問い合せるには:

  1. 前の演習で作成した問合せテンプレートであるqry_blank_2ax.txtを開きます。

  2. 列軸で、それぞれが単一のメンバーではなくメンバーの組合せである、2つのタプルを指定します。各タプルで複数のメンバーが表されるため、各タプルを丸カッコで囲みます。

    SELECT
      {([100-10],[East]), ([100-20],[East])}
    ON COLUMNS,
      {}
    ON ROWS
    FROM Sample.Basic
  3. 行軸で、各QuarterとProfitをネストして、4つのメンバーを持つタプルを指定します。

    SELECT
      {([100-10],[East]), ([100-20],[East])}
    ON COLUMNS,
      {
      ([Qtr1],[Profit]), ([Qtr2],[Profit]),
      ([Qtr3],[Profit]), ([Qtr4],[Profit])
      }
    ON ROWS
    FROM Sample.Basic
  4. qry_1ax.txtとして問合せを保存します。

  5. 最初の演習(「MDXセットおよびタプル」を参照)の説明に従って、MaxL Clientに問合せを貼り付け、実行します。

    結果は次のようになります。

    表28-3結果: 単一軸上での複数のディメンションの問合せ

    スペースのイメージが空のスレッド・セルに使用されます スペースのイメージが空のスレッド・セルに使用されます 100-10 100-20
    スペースのイメージが空のスレッド・セルに使用されます スペースのイメージが空のスレッド・セルに使用されます

    East

    East

    Qtr1

    利益

    2461

    212

    Qtr2

    利益

    2490

    303

    Qtr3

    利益

    3298

    312

    Qtr4

    利益

    2430

    287

MDX関数を使用したセットの構築

MDX関数を使用して、Essbaseメタデータまたはデータを操作できます。関数は、メンバー、セット、値、タプルまたは文字列を返します。MDXを使用してデータを分析、更新またはエクスポートする場合に役立ちます。

演習を試して、MemberRange関数およびCrossJoin関数を使用する方法について学習します。

MDX関数のこの概要は、セットを生成するいくつかの関数に重点を置いています。MDX問合せに手動でset member-by-memberまたはtuple-by-tupleを入力するかわりに、このような列挙を単純な関数式に置換できます。MDX関数は、セットおよびその他の値を戻すことができます。

たとえば、Childrenはset関数です。これは、入力メンバーの子メンバーのセットを返します。したがって、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ファンクションを使用するには:

  1. 「MDX問合せテンプレートの作成」で作成した問合せテンプレートであるqry_blank.txtを開きます。

  2. セットを戻す関数を使用するときは不要となる、中カッコ{}を削除します。

  3. コロン演算子を使用して、Qtr1からQtr4までのメンバー範囲を選択します。

    SELECT 
      [Qtr1]:[Qtr4]
    ON COLUMNS 
    FROM Sample.Basic
  4. 最初の演習(「MDXセットおよびタプル」を参照)の説明に従って、MaxL Clientに問合せを貼り付け、実行します。

    Qtr1、Qtr2、Qtr3およびQtr4が戻されます。

  5. MemberRange関数を使用して、同じメンバー範囲であるQtr1からQtr4までを選択します。

    SELECT
      MemberRange([Qtr1],[Qtr4])
    ON COLUMNS
    FROM Sample.Basic
  6. この問合せをMaxLクライアントに貼り付けて実行します。

  7. 問合せをgry_member_range_func.txtとして保存します。

演習6: CrossJoin関数の使用

CrossJoin関数は、異なるEssbaseディメンションからの2つのセットのクロス積を返します。構文は次のとおりです。

CrossJoin(set,set)

このファンクションでは、異なるディメンションの2つのセットを入力として、2つの入力セットが作成されます。これは相互積です。これは、対称レポートを作成する場合に便利です。

CrossJoinファンクションを使用するには:

  1. 「MDX問合せテンプレートの作成」で作成した問合せテンプレートであるqry_blank.txtを開きます。

  2. 列軸の中カッコ{}CrossJoin()に置き換えます。

    SELECT
      CrossJoin () 
    ON COLUMNS, 
      {}
    ON ROWS
    FROM Sample.Basic
  3. CrossJoin関数に指定される2つのセット引数のプレースホルダとして、2つの中カッコ・ペアをカンマで区切って追加します。

    SELECT
      CrossJoin ({}, {})
    ON COLUMNS,
      {}
    ON ROWS
    FROM Sample.Basic
  4. 最初のセットには、製品のメンバー[100-10]を指定します。2番目のセットには、市場のメンバー[East][West][South]および[Central]を指定します。

    SELECT
      CrossJoin ({[100-10]}, {[East],[West],[South],[Central]})
    ON COLUMNS,
      {}
    ON ROWS
    FROM Sample.Basic
  5. 行軸では、CrossJoinを使用して、メジャーのメンバーのセットとQtr1が含まれるセットをクロスします。

    SELECT
      CrossJoin ({[100-10]}, {[East],[West],[South],[Central]})
    ON COLUMNS,
      CrossJoin ( 
        {[Sales],[COGS],[Margin %],[Profit %]}, {[Qtr1]} 
      ) 
    ON ROWS
    FROM Sample.Basic
  6. 問合せをqry_crossjoin_func.txtとして保存します。

  7. この問合せをMaxLクライアントに貼り付けて実行します。

CrossJoinの使用を試してみると、引数の順序が出力のタプルの順序に影響します。

問合せの結果を次に示します。

表28-4結果: CrossJoin関数の使用

スペースのイメージが空のスレッド・セルに使用されます スペースのイメージが空のスレッド・セルに使用されます 100-10 100-10 100-10 100-10
スペースのイメージが空のスレッド・セルに使用されます スペースのイメージが空のスレッド・セルに使用されます

East

West

South

集中

販売

Qtr1

5731

3493

2296

3425

COGS

Qtr1

1783

1428

1010

1460

マージン%

Qtr1

66.803

59.118

56.01

57.372

利益率

Qtr1

45.82

29.974

32.448

24.613

ノート:

入力セットが基本ディメンションとその属性ディメンションの場合は、CrossJoinAttributeを使用することを検討してください。

演習7: children関数の使用

Children関数では、特定のメンバーのすべての子メンバーのセットが戻されます。次の構文を使用します:

Children (member)

ノート:

Childrenの別の構文は、これを入力メンバーの演算子として使用することです(例: member.Children)。この演習では、この演算子構文を使用します。

Children関数を使用して、最初の軸指定にショートカットを導入するには、次のようにします。

  1. 前の演習で作成した問合せであるqry_crossjoin_func.txtを開きます。

  2. 列軸指定の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
  3. 問合せをgry_children_func.txtとして保存します。

  4. この問合せをMaxLクライアントに貼り付けて実行します。

    CrossJoinの前の演習でも戻された結果と同じ結果が表示されます。

MDXを使用した参照レベルおよび世代

一部のMDX関数は、入力layer引数に基づいて設定操作を実行します。レイヤーは、Essbaseディメンションの世代またはレベルを表します。Members関数を使用してセットを参照する方法を学習します。

MDXでは、レイヤーの概念は、Essbase階層の世代とレベルを指します。

Essbaseでは、世代番号のカウントは、ディメンション名を1として開始し、世代番号が大きいほど階層内のリーフ・メンバーに近付くことになります。

レベル番号は、階層のリーフ側に近い部分を0として開始され、ディメンション名のレベル番号が最も大きくなります。

レイヤー引数を指定する方法は、次のとおりです。

  • 世代名またはレベル名。たとえば、StatesRegions

  • 世代名またはレベル名を伴うディメンション名。たとえば、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関数を使用するには:

  1. 「MDX問合せテンプレートの作成」で作成した問合せテンプレートであるqry_blank.txtを開きます。

  2. セットを戻す関数を使用するときは不要となる、中カッコ{}を削除します。

  3. Members関数とlevels関数を使用して、Sample.BasicのMarketディメンションのすべてのレベル0のメンバーを選択します。

    SELECT
      Members(Market.levels(0))
    ON COLUMNS
    FROM Sample.Basic
  4. qry_members_func.txtとして問合せを保存します。

  5. 最初の演習(「MDXセットおよびタプル」を参照)の説明に従って、MaxL Clientに問合せを貼り付け、実行します。

    結果: Marketディメンションのすべての州が戻されます。

スライサ軸を使用したMDX問合せ視点の設定

スライサ軸は、Essbaseキューブの特定の領域のみを考慮するようにMDX問合せを制限する方法です。サンプル演習を試して、スライサをWHERE句で使用する方法を学習します。

オプションのスライサを使用する場合は、MDX問合せのWHEREセクションで指定する必要があります。また、WHEREセクションは、キューブの指定(FROMセクション)の後に置き、問合せの最後の構成要素にする必要があります。

SELECT {set}
ON axes
FROM cube
WHERE slicer

スライサ軸を使用して、問合せのコンテキストを設定します。これは通常、他のすべての軸のデフォルトのコンテキストです。

Sample.BasicキューブのActual Salesのみ(予算計上済売上を除く)を選択する場合、WHERE句は次のようになります。

WHERE ([Actual], [Sales])

スライサ軸に(Actual、 Sales)が指定されているため、ON AXIS(n)のセットの指定に含める必要はありません。

ノート:

同じディメンションを他の軸とスライサ軸に表示することはできません。独自のディメンションの基準を使用して軸にフィルタリングするには、サブ選択を使用できます。

演習9: スライサ軸を使用した結果の制限

スライサ軸を使用して結果を制限するには:

  1. 「MDX関数を使用したセットの構築」の演習6で作成した問合せであるgry_crossjoin_func.txtを開きます。

  2. 最初の演習(「MDXセットおよびタプル」を参照)の説明に従って、MaxL Clientに問合せを貼り付け、実行します。

    データ・セルの1つに表示される結果に注意してください。たとえば、最初のタプル([Cola],[East],[Sales],[Qtr1])の値は、5731です。

  3. 戻されるデータを予算値のみに制限するために、スライサ軸を追加します。

    SELECT
      CrossJoin ({[100-10]}, {[East],[West],[South],[Central]})
    ON COLUMNS,
      CrossJoin (
        {[Sales],[COGS],[Margin %],[Profit %]}, {[Qtr1]}
      )
    ON ROWS
    FROM Sample.Basic
    WHERE (Budget)
  4. この問合せをMaxLクライアントに貼り付けて実行します。

  5. タプル([Cola],[East],[Sales],[Qtr1])の値が5020になりました。

  6. 問合せをqry_slicer_axis.txtとして保存します。

共通MDX関係関数

MDX関係関数は、Essbaseキューブ・アウトラインの階層メンバー関係に基づいて、セットまたはメンバーを返します。

次のMDX関係関数は、セットを返します。

表28-5セットを戻す関係関数のリスト

関係機能 説明

入力メンバーの子が戻されます。

兄弟

入力メンバーの兄弟を戻します。

子孫

様々なオプションでメンバーの子孫が戻されます。

次のMDX関係関数は、セットではなく単一メンバーを戻します。

表28-6単一メンバーを戻す関係関数のリスト

関係機能 説明

祖先

指定したレイヤーに存在する祖先が戻されます。

いとこ

別の祖先のメンバーと同じ位置にある子メンバーを返します。

入力メンバーの親が戻されます。

最初の子

入力メンバーの最初の子を戻します。

最終子

入力メンバーの最後の子を戻します。

最初の兄弟

入力メンバーの親の最初の子を戻します。

最終兄弟

入力メンバーの親の最後の子を戻します。

演習10: ドキュメントからいくつかの関係関数の例を試す

関係関数の動作を学習するには:

  1. 上の表の1つの関数へのリンクをクリックするか、「子」をクリックします。

  2. 例を読み、SELECT問合せをクリップボードにコピーします。

  3. 最初の演習(MDXセットおよびタプル)の説明に従って、MaxLクライアントに問合せを貼り付け、終了セミコロンを追加し、問合せを実行します。

セット操作用のMDX関数

これらのMDX関数をEssbaseとともに使用して、セットを比較、結合、結合または削減できます: CrossJoin、CrossJoinAttribute、Distinct、Except、Generate、Head、Intersect、Subset、TailおよびUnion。

演習を試して、Intersect関数と Union関数の違いを学習します。

次のセット関数は、キューブから詳細情報を導出しないで入力セットを操作します。

表28-7純粋なセット関数のリスト

純粋なセット関数 説明

CrossJoinCrossJoinAttribute

異なるディメンションの2つのセットのクロスセクションを戻します。

個別

セットから重複するタプルを削除します。

除く

2つのセットの差が含まれるサブセットを戻します。

生成

反復関数。set1の各タプルについて、set2を戻します。

ヘッド

セットに存在する最初のnのメンバーまたはタプルを戻します。

INTERSECT

2つの入力セットの共通部分を戻します。

サブセット

セットのサブセットを戻します。ここで、サブセットは、数値で指定された範囲のタプルです。

末尾

セットに存在する最後のnのメンバーまたはタプルを戻します。

UNION

2つの入力セットの結合を戻します。

演習11: Intersect関数の使用方法

MDX Intersect関数は、2つの入力セットの交差を返して、オプションで重複を保持します。これを使用して、両方のセットに存在するタプルを検索することによりセットを比較します。

構文は次のとおりです。

Intersect (set, set [,ALL])
  1. 「MDX問合せテンプレートの作成」で作成した問合せテンプレートであるqry_blank.txtを開きます。

  2. 軸から中カッコ{}を削除し、Intersect()に置き換えます。コードを追加するために、交差中カッコ内にいくつかの部屋を残します。たとえば:

    SELECT
       Intersect (
    
       )
    ON COLUMNS
    FROM Sample.Basic
  3. Intersect関数に指定する2つのセット引数のプレースホルダとして使用するために、中カッコの2つのペアをカンマで区切って追加します。たとえば:

    SELECT
       Intersect ( 
       { },
       { }
       )
    ON COLUMNS
    FROM Sample.Basic
  4. 最初のセット引数としてEastの子を指定します。たとえば:

    SELECT
       Intersect (
       { [East].children },
       { }
       )
    ON COLUMNS
    FROM Sample.Basic
  5. 2番目のセット引数に、Major MarketのUDAを持つMarkETディメンションのすべてのメンバーを指定します。たとえば:

    SELECT
       Intersect (
       { [East].children },
       { UDA([Market], "Major Market") }
       )
    ON COLUMNS
    FROM Sample.Basic
  6. 最初の演習(「MDXセットおよびタプル」を参照)の説明に従って、MaxL Clientに問合せを貼り付け、実行します。

    Major MarketのUDAを持つEastのすべての子が戻されます。たとえば:

    New York   Massachusetts   Florida
    
    8202       6172            5029
  7. 問合せをqry_intersect_func.txtとして保存します。

演習12: Union関数の使用方法

MDX Union関数は、2つの入力セットを結合し、オプションで重複を保持します。これを使用して、2つのセットを1つのセットに結合します。

構文は次のとおりです。

Union (set, set [,ALL])
  1. 前の演習で作成した問合せであるqry_intersect_func.txtを開きます。

  2. IntersectUnionに置き換えます。

  3. 問合せをqry_union_func.txtとして保存します。

  4. この問合せをMaxLクライアントに貼り付けて実行します。

    IntersectはM Major MarketのUDAを持つEastの子のみが含まれているセットを戻しますが、UnionはEastの大きなセットを戻します。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]という名前を付けないでください。

複数の計算済メンバーを使用して比率またはカスタム合計を作成する場合は、各計算済メンバーに解決順を設定することをお薦めします。

名前付きセット

WITH SETキーワードを使用して、問合せのSELECT部分の前に名前付きセットを定義します。定義すると、問合せの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)
  1. qry_blank_2ax.txtを開きます。これは、「軸とキューブ仕様を使用したMDX問合せレイアウト」の演習3で作成した問合せテンプレートです。

    SELECT
      {}
    ON COLUMNS,
      {}
    ON ROWS
    FROM Sample.Basic
  2. 行軸のセットでProductの子を指定します。たとえば:

    SELECT
      {}
    ON COLUMNS,
      {[Product].children}
    ON ROWS
    FROM Sample.Basic
  3. 問合せの先頭に、計算済メンバーの指定のプレースホルダを追加します。たとえば:

    WITH MEMBER [].[]
     AS ''
    SELECT
      {}
    ON COLUMNS,
      {[Product].children}
    ON ROWS
    FROM Sample.Basic
  4. 計算済メンバーをMeasuresディメンションに関連付け、Max Qtr2 Salesという名前にするには、この情報を計算済メンバーの指定に追加します。たとえば:

    WITH MEMBER [Measures].[Max Qtr2 Sales]
     AS ''
    SELECT
      {}
    ON COLUMNS,
      {[Product].children}
    ON ROWS
    FROM Sample.Basic
  5. 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
    
  6. 計算済メンバー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
    
  7. 問合せをgry_calc_member.txtとして保存します。

  8. 最初の演習(「MDXセットおよびタプル」を参照)の説明に従って、MaxL Clientに問合せを貼り付け、実行します。

    問合せの結果を次に示します。

    表28-8結果: 計算済メンバーの作成

    スペースのイメージが空のスレッド・セルに使用されます 最大四半期2売上

    100

    27187

    200

    27401

    300

    25736

    400

    21355

    ダイエット

    26787

ノート:

MDXリファレンス・ドキュメントには、さらに多くの例があります。MDX With Sectionを参照してください。

反復MDX関数

反復MDX関数は、Essbaseキューブ内のデータ・セットをループし、結果を調整するために指定した検索条件を実行します。ブール・テストに基づいてデータをフィルタ処理する例を参照してください。

表28-9反復MDX関数のリスト

関数 説明

フィルタ

検索条件の値がTRUEである、setのサブセットのタプルが戻されます。

IIF

条件付きテストが実行され、テストがTRUEまたはFALSEのどちらに評価されるかに応じて、適切な数値式またはセットが戻されます。

ケース

条件付きテストが実行され、指定した結果が戻されます。

生成

set1の各タプルについて、set2を戻します。

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キーワードによってそのタプルが消去されます。

たとえば、行の値に空でないものが1つでもある場合、行全体が返されます。行軸仕様の先頭にNON EMPTYを含めると、問合せによって返されるセットから次の行スライスが削除されます。

Qtr1、Actualの#MISSING値の行

NON EMPTYで欠落値を抑制することに加えて、次のMDX関数を使用して、#MISSING結果を処理できます。

  • CoalesceEmpty: #MISSING以外の値を検索する数値式を検索します

  • IsEmpty: 入力数値式の値が#MISSINGに評価される場合にTRUEを返します。

  • オプションのIncludeEmptyフラグが使用されていない場合に平均から欠落値を省略するAvg

NonEmptyCount MDX関数は、#Missing以外の値に評価される、セット内のタプルの数のカウントを戻します。各タプルが評価され、この関数によって返されるカウントに含まれます。数値式が指定されている場合、式はすべてのタプルのコンテキストで評価され、#MISSING以外の値のカウントが返されます。

集約ストレージ・キューブの場合のみ、NonEmptyCount関数が最適化されるため、1回のみのキューブのスキャンで、すべてのセルの重複除去したカウントの計算を実行できます。この最適化を行わないと、データベースは、個別のカウントに対応するセルの数と同じ回数スキャンされます。アウトライン・メンバー式に次の構文がある場合、NonEmptyCount最適化がトリガーされます。

NONEMPTYCOUNT(set, measure, exclude_missing)

exclude_missingパラメータは、個別のカウント計算を実行するメトリックを問い合せる問合せのパフォーマンスを向上させることにより、集約データベースでのNonEmptyCountの最適化をサポートします。

NONEMPTYMEMBERとNONEMPTYTUPLEの最適化プロパティを使用すると、MDXで、#MISSINGデータのみを含む寄与しない値での式の実行をスキップしながら、メンバーまたはタプルの大規模なセットを問い合せることができます。

  • 計算メンバーまたは数式の先頭に単一のNONEMPTYMEMBERプロパティ句を使用して、Essbaseに対し、nonempty_member_listで指定した、いずれかのメンバーが空であるときに、数式または計算メンバーの値が空であることを示します。

  • 計算メンバーまたは数式の先頭に単一のNONEMPTYTUPLEプロパティ句を使用して、Essbaseに対し、nonempty_member_listで指定したタプルのセル値が空であるときに、数式または計算メンバーの値が空であることを示します。

入力セットが指定されている場合に、NonEmptySubset MDX関数は、すべてのタプルを空でないものと評価するその入力セットのサブセットを返します。空でないことを確認するために、オプションの値式を指定できます。この関数は、空でない組合せのセットが小規模であることがわかっている大規模なセットに基づいた問合せの最適化に役立つことがあります。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では、propertiesでデータとメタデータの特定の特性を記述します。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 Custom Propertiesも参照してください。

問合せ軸でのプロパティの起動

軸セットごとにディメンションとプロパティの組合せをリストできます。問合せが実行されると、指定したプロパティが、指定したディメンションのすべてのメンバーに対して評価され、結果セットに含まれます。

たとえば、次の問合せによって、列軸では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