4).CurrentMember
構文:ディメンション.CurrentMember(戻り:メンバー)
階層.CurrentMember(戻り:メンバー)
繰り返し式の中で「現在のメンバー」を戻します。クロス集計表中の計算されるメンバーなどでよく使用します。
5)CrossJoin()
構文:CrossJoin(セット1,セット2(,セット3…))(戻り:セット)
2つ以上のセットのクロス積を返します。
複数の異なるディメンジョンのメンバー同士の全組み合わせ、例えば商品ごとの売上金額と売上数量などを1つの軸に並べたい場合などに使用します。
SQL Server Analysis Servicesでは、Crossjoinとまったく同じ結果を返す記述としてセット同士を「*」で繋げる方法もあります。
構文:{セット1} * {セット2} (* {セット3}…)(戻り:セット)
セット1が「食器」、「寝具」、「文房具」という3つのメンバーを持ち、セット2が「数量」、「金額」という2つのメンバーを持っている場合、Crossjoinは次のようなセットを返します。

タプル記述とCrossJoinの混同
ここでちょっと不思議なMDX文を考えます。第2回で出てきた次のMDXを見てください。
SELECT { [TOKUISAKI].[TODOFUKENMEI].CHILDREN
} ON COLUMNS,
{ ([SHOHIN].[SHOHINBUNRUIMEI].CHILDREN,
{[Measures].[SURYO],[Measures].[URIKINGAKU]}
)
} ON ROWS
FROM [Sales]
このMDXのクエリー結果の縦軸は、CrossJoinそのものでした。しかし、このMDX式には「CrossJoin」の記述も、「*」の記述もありません。
ためしに次のように書き換えてみましょう。
SELECT { [TOKUISAKI].[TODOFUKENMEI].CHILDREN
} ON COLUMNS,
{ CrossJoin([SHOHIN].[SHOHINBUNRUIMEI].CHILDREN,
{[Measures].[SURYO],[Measures].[URIKINGAKU]}
)
} ON ROWS
FROM [Sales]
CrossJoinを明記してみました。実行結果はどう変わるでしょうか?
実は、この2つのMDXはまったく同じクエリー結果を返します。これはどういうことなのでしょうか? もう一度、書き換え前のMDXの縦軸の記述を見てみます。
([SHOHIN].[SHOHINBUNRUIMEI].CHILDREN,
{[Measures].[SURYO],[Measures].[URIKINGAKU]})
この部分は()で括られており、第2回では「タプルである」と解説しています。しかしよく考えてみると、タプルとは「次元の異なる1つ以上のメンバーで構成される」という定義でした。この式はどうでしょうか?
[SHOHIN].[SHOHINBUNRUIMEI].CHILDRENも、{[Measures].[SURYO],[Measures].[URIKINGAKU]}も、メンバーではなくセットです。そしてこの記述の戻りもセットです。
つまり、「この記述はタプルではなく、セットを表している」ということになります。しかしタプルを表わす()で括られています。一体これはどういうことでしょう?
実は、厳密なことは筆者にも分かりません。おそらくこの記述は、
CrossJoin([SHOHIN].[SHOHINBUNRUIMEI].CHILDREN,
{[Measures].[SURYO],[Measures].[URIKINGAKU]})
から「CrossJoin」の記述を省略したもの、と考えると良いようです。つまり、この()は、タプルを表しているのではなく、CrossJoin関数のパラメータを表している、と考えると辻褄が合います。
第2回の解説では簡単に説明するために、あえて「タプル」として解説しましたが、正確にはタプルではなく「セット」だったのです。
このようにMDXでは、ときおり不可解な記述がまかり通ることがあります。これはおそらく過度な記述省略が許されているからなのだと思われるのですが、あまり深く考えすぎず、慣れてしまうこともMDX習得には大切なことのようです。

