スコープとコンテキストの管理 (MDX)
Microsoft SQL Server Analysis Services では、多次元式 (MDX) スクリプトをキューブ全体に適用することも、スクリプト実行の特定の時点でキューブの特定の部分に適用することもできます。 MDX スクリプトは、計算パスを使用することにより、階層化されたアプローチでキューブ内の計算を実行することができます。
注 |
---|
計算パスが計算に及ぼす影響の詳細については、「パス順序と解決順序の概要 (MDX)」を参照してください。 |
MDX スクリプト内の計算パス、スコープ、およびコンテキストを制御するための具体的な方法は、CALCULATE ステートメント、This 関数、および SCOPE ステートメントを使用することです。
CALCULATE ステートメントの使用
CALCULATE ステートメントは、キューブ内の各セルに集計データを格納します。 たとえば、既定の MDX スクリプトの冒頭には、単一の CALCULATE ステートメントが置かれています。
CALCULATE ステートメントの構文の詳細については、「CALCULATE ステートメント (MDX)」を参照してください。
注 |
---|
スクリプトの中で CALCULATE ステートメントが SCOPE ステートメントに入れられている場合、MDX は CALCULATE ステートメントの評価を、キューブ全体に対してではなく、SCOPE ステートメントで定義されるサブキューブのコンテキストの中で行います。 |
This 関数の使用
This 関数により、MDX スクリプトの中で現在のサブキューブを取得できます。 This 関数を使用すると、現在のサブキューブの中のセルの値を MDX 式にすばやく設定できます。 This 関数を SCOPE ステートメントと併用して、特定の計算パスの間に特定のサブキューブの内容を変更することもできます。
注 |
---|
スクリプトの中で This 関数が SCOPE ステートメントに入れられている場合、MDX は This 関数の評価を、キューブ全体に対してではなく、SCOPE ステートメントで定義されるサブキューブのコンテキストの中で行います。 |
This 関数の例
次の MDX スクリプト コマンドの例では、This 関数を使用することにより、 Adventure Works DW Multidimensional 2012 サンプル キューブにおいて、Customer ディメンションの Redmond メンバーの子に関して、Finance メジャー グループの Amount メジャーの値を 10% 増加させます。
/* This SCOPE statement defines the current subcube */
SCOPE([Customer].&[Redmond].MEMBERS,
[Measures].[Amount], *);
/* This expression sets the value of the Amount measure */
THIS = [Measures].[Amount] * 1.1;
END SCOPE;
This 関数の構文の詳細については、「This (MDX)」を参照してください。
SCOPE ステートメントの使用
SCOPE ステートメントは、MDX スクリプト内の他の MDX 式およびステートメントが入っている現在のサブキューブを定義し、その MDX 式およびステートメントのスコープを指定します。 MDX は、このような他の MDX 式およびステートメント (This 関数および CALCULATE ステートメントを含む) の評価を、サブキューブのコンテキストの中で行います。
SCOPE ステートメントは動的ですが、反復的な性質はありません。 SCOPE ステートメントに入っているステートメントは 1 回だけ実行されますが、サブキューブ自体は動的に決定されます。 たとえば、SampleCube というキューブがあるとします。 SampleCube キューブに対して以下の SCOPE ステートメントを適用し、コンテキストを Measures ディメンション内の ALLMEMBERS に定義するサブキューブを定義します。
SCOPE([Measures].ALLMEMBERS);
THIS = [Measures].ALLMEMBERS.COUNT;
END SCOPE;
この SCOPE ステートメント内のステートメントと式は 1 回だけ実行されます。
今度は、あるビジネス ユーザーが、ExistingMeasure という 1 つのメジャーが含まれている以下の MDX クエリを、SampleCube キューブに対して実行します。
WITH MEMBER [Measures].[NewMeasure] AS '1'
SELECT
[Measures].ALLMEMBERS ON COLUMNS,
[Customer].DEFAULTMEMBER ON ROWS
FROM
[SampleCube]
クエリは、以下の表に示す出力のようなセル セットを返します。
[ExistingMeasure] |
[NewMeasure] |
|
---|---|---|
[Customer].[All] |
2 |
2 |
返されたセル セットを見て、MDX スクリプトの SCOPE ステートメントに含まれている ExistingMeasure 値が、NewMeasure メジャーが定義された後で、どのように動的に更新されるかに注目してください。
SCOPE ステートメントを別の SCOPE ステートメント内で入れ子にすることができます。 しかし、SCOPE ステートメントは反復的でないので、SCOPE ステートメントを入れ子にする主な目的は、特別な処理のためにサブキューブをさらに細かく分割することです。
SCOPE ステートメントの例
次の MDX スクリプトの例では、SCOPE ステートメントを使用することにより、 Adventure Works DW Multidimensional 2012 サンプル キューブにおいて、Customer ディメンションの Redmond メンバーの子に関して、Finance メジャー グループの Amount メジャーの値を 10% 大きく設定します。 しかし、別の SCOPE ステートメントにより、2002 年の子の Amount メジャーが含まれるようにサブキューブが変更されます。 最終的に、Amount メジャーはこのサブキューブに関してのみ集計され、他の年の Amount メジャーの値は集計されません。
/* Calculate the entire cube first. */
CALCULATE;
/* This SCOPE statement defines the current subcube */
SCOPE([Customer].&[Redmond].MEMBERS,
[Measures].[Amount], *);
/* This expression sets the value of the Amount measure */
THIS = [Measures].[Amount] * 1.1;
END SCOPE;
SCOPE ステートメントの構文の詳細については、「SCOPE ステートメント (MDX)」を参照してください。