MDX の主な概念 (MDX)
多次元式 (MDX) を使用すると、多次元データに対するクエリの実行や、キューブ内で使用する MDX 式の作成を行うことができますが、まず MicrosoftSQL ServerAnalysis Services のディメンションの概念と用語を理解しておく必要があります。次のセクションでは、必要とされる基本的なディメンション モデリングの概念と用語について簡単に説明します。その後の各セクションでは、ディメンション モデリングの概念を応用する方法について説明します。
詳細については、Microsoft TechNet Web サイトにある「SQL Server 2005 - Analysis Services」ページの「その他のリソース」セクションを参照してください。MDX クエリおよび計算に関するパフォーマンスの問題の詳細については、「SQL Server 2005 Analysis Services パフォーマンス ガイド」の「効率的な MDX の記述」セクションを参照してください。
ディメンション モデリングの用語と概念
MicrosoftSQL ServerAnalysis Services キューブは、メジャー、ディメンション、およびディメンション属性に基づいて構成されます。MDX 式言語を使用するために必要なディメンション モデリングの用語と概念を次に示します。
データベース ディメンション
データベース ディメンションは、キー属性に関連付けられたディメンション属性の集合です。キー属性自体はメジャー ディメンション内のファクトに関連付けられています。ディメンションの属性
ディメンションの属性は、ディメンション テーブルの 1 つ以上の列にバインドされ、メンバを格納します。ディメンションの属性には、顧客名、月名、製品名などが格納されます。メンバ
メンバは、メジャー ディメンションを含むディメンション属性の値です。階層内のメンバとしては、リーフ メンバ、親メンバ、データ メンバ、(All) メンバがあります。メジャー
メジャーは、ファクト テーブルの値です。ファクトともいいます。メジャー ディメンションの値を総称して、メンバという場合もあります。メジャーは一般的に数値ですが、文字列値の場合もあります。メジャー ディメンション
メジャー ディメンションは、キューブ内のすべてのメジャーを格納するディメンションです。メジャー ディメンションは特殊なディメンションであり、このディメンションでは通常、指定したメジャーのある各ディメンション属性の現在のメンバに基づいて、メンバが集計 (合計、個数のカウントなど) されます。メジャー グループ
メジャー グループは、SQL Server Analysis Services のキューブ内で関連するメジャー (一般的には、同一のファクト テーブルに属するメジャー) のコレクションです。SQL Server Analysis Services では、1 つのキューブに複数のメジャー グループを格納できます。(All) メンバ
(All) メンバは、属性階層またはユーザー定義階層のすべてのメンバを計算した値です。計算されるメンバ
計算されるメンバは、クエリ実行時に定義と計算が行われるディメンション メンバです。計算されるメンバをユーザー クエリまたは MDX 計算スクリプトで定義して、サーバーに保存しておくことができます。計算されるメンバは、その計算されるメンバが定義されているディメンション内のディメンション テーブルの行と対応します。データ メンバ
データ メンバは、親子階層の親メンバに関連付けられた子メンバです。データ メンバには、親メンバの子の集計値ではなく、親メンバで使用するデータ値が格納されます。親メンバ
親メンバは、親子階層のメンバであり、子を集計した値を格納します。リーフ メンバ
リーフ メンバは、階層の中で子が存在しないメンバです。子メンバ
子メンバは、階層の中で最上位レベルより下にあるメンバです。キー属性
データベース ディメンションのキー属性は、直接的または間接的にそのディメンションのすべての非キー属性がリンクされている属性です。キー属性は多くの場合、粒度属性でもあります。粒度属性
メジャー ディメンションのメジャー グループ内のファクトにディメンションをリンクするための、キューブ ディメンションの属性です。粒度属性とキー属性が別々の属性である場合、直接的または間接的に非キー属性を粒度属性にリンクする必要があります。キューブ内ではディメンションの粒度が粒度属性で定義されます。キューブ ディメンション
キューブ ディメンションは、キューブ内のデータベース ディメンションのインスタンスです。属性階層
属性階層は、属性メンバから構成される階層であり、以下のレベルがあります。リーフ レベル。個別の属性メンバが含まれています。リーフ レベルの各メンバをリーフ メンバともいいます。
中間レベル (属性階層が親子階層の場合)。
(All) レベル (必要に応じて IsAggregatable=True を指定した場合)。属性階層のリーフ メンバを集計した値が含まれています。(All) レベルのメンバを (All) メンバともいいます。
既定では、ディメンション属性ごとに属性階層が定義されます (AttributeHierarchyEnabled=True)。属性階層は既定で表示されます (AttributeHierarchyVisible=True)。
均衡階層
均衡階層は、最上位メンバと任意のリーフ メンバの間のレベル数が等しい階層です。不規則階層
不均衡階層を参照してください。不均衡階層
不均衡階層は、最上位とリーフ レベルの間のレベル数が一様でない階層です。不均衡階層の例として、親子階層があります。不均衡階層は不規則階層ともいいます。親子階層
親子階層は、ディメンションの属性の種類が parent に設定された特殊な属性階層です。親子階層は子メンバと親メンバから構成される不均衡階層です。親子階層には、以下のレベルがあります。子レベル。親メンバの子が含まれています。子には、データ メンバなど、親メンバで集計される属性メンバが含まれています。
中間レベル。親メンバが含まれます。
(All) レベル (必要に応じて IsAggregatable=True を指定した場合)。親子階層のリーフ メンバを集計した値が含まれています。(All) レベルのメンバを (All) メンバともいいます。
ディメンションに存在できる親子階層は 1 つのみで、その階層はキー属性に関連付ける必要があります。
ユーザー定義階層
ユーザー定義階層は、キューブ データをユーザーが見やすくするために使用される、属性階層の均衡階層です。ユーザー定義階層はキューブ空間に追加されません。ユーザー定義階層のレベルを特定の状況で非表示にして、不均衡階層として表示できます。属性リレーションシップ
属性リレーションシップは、ディメンション属性 state と city の間のリレーションシップのように、属性間の一対多のリレーションシップです。メンバ プロパティ
メンバ プロパティは、顧客の性別、製品の色など、属性メンバのプロパティです。セル
キューブのセルは、メジャー ディメンションのメンバとキューブ内の各属性階層のメンバが交差する領域です。メジャー ディメンションのメンバとして、リーフ メンバ (独立したファクト)、または集計メンバ (年間で集計した売り上げなど) があります。
ディメンションのメンバとして、リーフ メンバ、データ メンバ、親メンバ、または (All) メンバがあります。
キューブ空間
キューブ空間は、そのキューブのメジャーを伴った、キューブの属性階層のメンバから構成されます。サブキューブ
サブキューブは、キューブにフィルタを適用したビューを表す、キューブのサブセットです。サブキューブを定義するには、MDX 計算スクリプトの SCOPE ステートメント、または MDX クエリのサブセレクト句を使用します。サブセレクトで定義したサブキューブ
MDX クエリのサブセレクト句で定義したサブキューブには、このサブキューブ定義と共に存在するすべてのメンバが含まれます。その結果を次に示します。ある階層の (All) メンバを含めると、その階層のすべてのリーフ メンバも含まれます。
任意のメンバを含めると、その先祖と子孫が含まれます。
ユーザー定義階層内のあるレベルのすべてのメンバを含めると、そのユーザー定義階層のすべてのメンバが含まれます。ただし、そのレベルのメンバと共存できない他の階層のメンバは除外される可能性があります (顧客が含まれていない市町村など)。
キューブから作成したサブキューブには、そのキューブのすべての (All) メンバが常に存在します。
サブキューブ内の集計値はビジュアル合計で算出されます。
組
組は、キューブに所属するすべての属性階層の属性から構成された属性メンバを組み合わせて、セルを一意に識別します。MDX クエリまたは式で組を定義する際に、すべての属性階層の属性メンバを明示的に含める必要はありません。属性階層のメンバをクエリまたは式に明示的に含めなかった場合、その属性階層の既定のメンバが暗黙的に組に含められます。(All) メンバが存在する場合、キューブで他に明示的に定義されていない限り、(All) メンバがすべての属性階層の既定のメンバになります。属性階層に (All) メンバが存在しない場合、属性階層の最上位のメンバが既定のメンバになります。既定のメジャーを明示的に定義している場合を除き、キューブ内で指定された最初のメジャーが既定のメジャーになります。詳細については、「既定メンバの定義」および「DefaultMember (MDX)」を参照してください。
たとえば、次の組はメジャー ディメンションの単一のメンバのみを明示的に定義することで、Adventure Works データベースの 1 つのセルを識別しています。
(Measures.[Reseller Sales Amount])
上記の例は、メジャー ディメンションの Reseller Sales Amount メンバとキューブに所属するすべての属性階層の既定のメンバから構成されるセルを一意に識別します。Destination Currency 属性階層を除くすべての属性階層の既定のメンバは (All) メンバです。Destination Currency 階層の既定のメンバは US Dollar メンバです (この既定のメンバは Adventure Works キューブの MDX スクリプトで定義されています)。
重要 |
---|
組で指定されている属性階層のメンバは、ディメンションの属性間に定義されているリレーションシップの影響を受けます。詳細については、「属性リレーションシップとキューブ空間」を参照してください。 |
次のクエリは、上記の例で指定した組が参照するセルの値 ($80,450.596.98) を返します。
SELECT
Measures.[Reseller Sales Amount] ON COLUMNS
FROM [Adventure Works]
注意 |
---|
クエリでセット (ここでは、1 つの組から構成されます) の軸を指定するときは、行の軸のセットを指定する前に列の軸のセットを指定する必要があります。列の軸は、axis(0)、または単に 0 とも表現できます。MDX クエリの詳細については、「MDX の基本的なクエリ (MDX)」を参照してください。 |
上記の例のように、クエリで組を使用して、その組が参照しているセルの値を取得できます。また、式で組を使用して、組で指定されているメンバを明示的に参照できます。組を取得または使用する関数をクエリまたは式で使用できます。組を使用して、組で指定されているセルの値を参照できます。また、関数内で使用する場合はメンバの組み合わせを指定できます。
組の中のメンバの並びまたは順序を組の次元といいます。暗黙的なメンバの出現順序は常に変わらないので、通常は組の中で明示的に定義されているメンバについて次元を考えます。組のメンバの順序は、組のセットを定義するときに重要です。次の例では、列の軸となる組で 2 つのメンバが使用されています。
SELECT
([Measures].[Reseller Sales Amount],[Date].[Calendar Year].[CY 2004]) ON COLUMNS
FROM [Adventure Works]
注意 |
---|
複数のディメンションから構成される組のメンバを明示的に指定するときは、組全体をかっこで囲む必要があります。組のメンバ 1 つのみを指定する場合、かっこの使用は任意です。 |
上記の例のクエリで使用している組は、メジャー ディメンションの Reseller Sales Amount メジャーと Date ディメンションの Calendar Year 属性階層の CY 2004 メンバが交差するキューブ セルを返すよう指定しています。
注意 |
---|
属性メンバは、メンバ名またはメンバ キーで参照できます。上記の例で、[CY 2004] への参照を &[2004] としてもかまいません。 |
セット
セットとは、同じ次元の組を決まった順序で並べたものです。次にセットの例を示します。
SELECT
{
([Measures].[Reseller Sales Amount],
[Date].[Calendar Year].[CY 2003]),
([Measures].[Reseller Sales Amount],
[Date].[Calendar Year].[CY 2004])
} ON COLUMNS
FROM [Adventure Works]
注意 |
---|
組のセットを示すには、中かっこ {} を使用します。 |
上記の例で、セット内の各組は、いずれも最初のメンバがメジャー ディメンションのメンバ、2 番目のメンバが Calendar Year 属性階層のメンバなので、次元が同じです。いずれかの組の 2 番目のメンバが Date ディメンションの別の属性階層 (Calendar Month など) である場合、次元が違うことを示すエラーが発生します。
ヒント |
---|
セットに別名を付けて、名前付きセットを作成できます。名前付きセットを使用すると、複雑な MDX クエリを処理するときに MDX クエリがわかりやすく、また再利用しやすくなります。名前付きセットを使用するには、セット識別子の後に "AS" を付け、その後に指定する別名を入力します。 |
キューブ空間と autoexist
このトピックで既に定義したとおり、キューブ空間は属性階層のメンバから構成されます。autoexist の概念を導入すると、このキューブ空間を、実際に存在するセルのみに限定できます。あるディメンション内の属性階層のメンバは、同じディメンション内の別の属性階層のメンバと共存できない場合があります。
たとえば、City 属性階層、Country 属性階層、および Internet Sales Amount メジャーが含まれたキューブがあるとします。このキューブの空間には、共存できるメンバのみが含まれます。City 属性階層に都市 New York、London、Paris、Tokyo、Melbourne があり、Country 属性階層に国 United States、United Kingdom、France、Japan、Australia があるとすると、このキューブ空間に Paris と United States が交差する領域 (セル) は含まれません。
存在しないセルに対するクエリを実行すると、NULL が返されます。つまり、存在しないセルには計算を含めることができないので、この領域に書き込みを行う計算は定義できません。たとえば、次のステートメントには、存在しないセルが含まれています。
SELECT [Customer].[Gender].[Gender].Members ON COLUMNS,
{[Customer].[Customer].[Aaron A. Allen]
,[Customer].[Customer].[Abigail Clark]} ON ROWS
FROM [Adventure Works]
WHERE Measures.[Internet Sales Amount]
注意 |
---|
このクエリでは、Members (セット) (MDX) 関数を使用して列軸の Gender 属性階層のメンバのセットを取得し、それを行軸の Customer 属性階層のメンバの限定的なセットと交差させています。 |
上記のクエリを実行すると、Aaron A. Allen と Female が交差するセルに NULL が表示されます。同様に、Abigail Clark と Male が交差するセルに NULL が表示されます。これらのセルは存在しないため値を含めることができませんが、クエリから返される結果には、存在しないセルが表示される場合があります。
Crossjoin (MDX) 関数を使用して同一ディメンションの異なる属性階層に属するメンバのクロス積を取得した場合、取得される組は完全なデカルト積ではなく、autoexist によって実際に存在する組のセットのみに限定されます。たとえば、次のクエリを実行し、実行結果を確認します。
SELECT CROSSJOIN
(
{[Customer].[Country].[United States]},
[Customer].[State-Province].Members
) ON 0
FROM [Adventure Works]
WHERE Measures.[Internet Sales Amount]
注意 |
---|
このクエリでは、列軸を表す axis(0) の略記である 0 を使用して、列軸を指定しています。 |
上のクエリを実行すると、クエリ内の各属性階層から、共存できるメンバのセルのみが返されます。上のクエリは、* (クロス積) (MDX) 関数の新しい * バリアントを使用して記述することもできます。
SELECT
[Customer].[Country].[United States] *
[Customer].[State-Province].Members
ON 0
FROM [Adventure Works]
WHERE Measures.[Internet Sales Amount]
上のクエリは、次のように記述することもできます。
SELECT [Customer].[State-Province].Members
ON 0
FROM [Adventure Works]
WHERE (Measures.[Internet Sales Amount],
[Customer].[Country].[United States])
結果セットのメタデータが異なりますが、返されるセルの値は同一です。たとえば上のクエリで、Country 階層は (WHERE 句の) スライサ軸に移動されたので、結果セットに明示的には出現しません。
これら 3 つのクエリはいずれも、SQL ServerAnalysis Services の autoexist の効果を示しています。
ユーザー定義階層とキューブ空間
このトピックのここまでの例では、属性階層を使用してキューブ空間内の位置を定義していました。キューブ空間内の位置は、ディメンション内の属性階層を基に定義したユーザー定義階層を使用して定義することもできます。ユーザー定義階層は、ユーザーによるキューブ データの参照を容易にするための、属性階層の階層です。
たとえば、上のセクションの CROSSJOIN クエリは、次のようにも記述できます。
SELECT CROSSJOIN
(
{[Customer].[Country].[United States]},
[Customer].[Customer Geography].[State-Province].Members
)
ON 0
FROM [Adventure Works]
WHERE Measures.[Internet Sales Amount]
先ほど属性階層を使用して定義していたキューブ空間内の位置を、このクエリでは、Customer ディメンション内の Customer Geography ユーザー定義階層で定義しています。属性階層とユーザー定義階層のどちらを使用しても、キューブ空間内の同じ場所を定義できます。
属性リレーションシップとキューブ空間
関連する属性間に属性リレーションシップを定義すると、(適切な集計が円滑に作成されるようになり) クエリのパフォーマンスが向上するだけでなく、属性階層のメンバと共に出現する、関連する属性階層のメンバに影響を及ぼします。たとえば、City 属性階層のメンバが含まれた組を定義した場合、その組に Country 属性階層のメンバが明示的に定義されていなくても、関連する Country 属性階層のメンバが Country 属性階層の既定メンバであると予測できます。ただしこれは、City 属性階層と Country 属性階層の間に属性リレーションシップが定義されている場合に限ります。
次の例は、関連する属性階層に所属する、クエリに明示的に含まれていないメンバを返します。
WITH MEMBER Measures.x AS
Customer.Country.CurrentMember.Name
SELECT Measures.x ON 0,
Customer.City.Members ON 1
FROM [Adventure Works]
注意 |
---|
この例では、WITH キーワードを CurrentMember (MDX) 関数および Name (MDX) 関数と共に使用して、クエリで使用するための計算されるメンバを作成しています。詳細については、「MDX の基本的なクエリ (MDX)」を参照してください。 |
上のクエリでは、State 属性階層の各メンバに関連付けられた Country 属性階層のメンバの名前が返されます。City 属性と Country 属性の間には属性リレーションシップが定義されているので、予測どおりに Country メンバが返されます。ところが、次のクエリで示すように、同一ディメンションの属性階層間に属性リレーションシップが定義されていない場合は、(All) メンバが返されます。
WITH MEMBER Measures.x AS
Customer.Education.Currentmember.Name
SELECT Measures.x ON 0,
Customer.City.Members ON 1
FROM [Adventure Works]
上のクエリでは、Education と City の間に属性リレーションシップが定義されていないので、(All) メンバ ("All Customers") が返されます。したがって、Education メンバが明示的に指定されていない場合、City 属性階層が含まれている組の Education 属性階層の既定のメンバは Education 属性階層の (All) メンバになります。
計算コンテキスト
すべてのセット、メンバ、組、数値関数は、MDX 式またはステートメント全体のコンテキストで実行されます。組などの引数を関数に渡す際には、キューブ空間内の一部の座標のみが明示的に指定されます。その他の座標は現在の計算コンテキストを基に取得されます。指定のないセル座標と属性メンバの計算コンテキストは、次の順序で決定されます。
FROM 句 (該当する場合) : キューブ全体、または SELECT ステートメントの形式でサブキューブを指定できます。
WHERE 句 (該当する場合) : スライサ軸ともいいます。この軸に、クエリの列と行の軸で返されるメンバを制限するセット、組、メンバを指定します。概念上、列または行の軸で明示的に指定されていないすべての属性階層の既定のメンバは、スライサ軸の一部として使用されます。
注意 特定の属性のセル座標がスライサ軸とそれ以外の軸で指定されている場合、軸のセットのメンバを決定する際に、関数で指定されている座標が優先的に使用されることがあります。Filter (MDX) 関数および Order (MDX) 関数はその例です。WHERE 句、または FROM 句の SELECT ステートメントによって計算コンテキストから除外された属性メンバを使用して、結果の絞り込みや順序指定ができます。
クエリまたは式で定義されている、名前付きセットと計算されるメンバ。
行軸および列軸で指定された組とセット : 行軸、列軸、またはスライサ軸に出現しない属性については、既定のメンバが使用されます。
各軸上のキューブ セルまたはサブキューブ セル : 軸上の空の組が削除され、HAVING 句が適用されます。
詳細については、「クエリ内のキューブ コンテキストの確立 (MDX)」を参照してください。
次のクエリでは、WHERE 句で指定されている Country 属性のメンバと Calendar Year 属性のメンバによって、行軸の計算コンテキストを制限しています。
SELECT Customer.City.City.Members ON 0
FROM [Adventure Works]
WHERE (Customer.Country.France, [Date].[Calendar].[Calendar Year].[CY 2004],
Measures.[Internet Sales Amount])
- このクエリを修正して、行軸に FILTER 関数を指定し、この FILTER 関数に Calendar Year 属性階層のメンバを指定した場合、列軸上のセットのメンバに対して計算コンテキストを指定している Calendar Year 属性階層の属性メンバを変更できます。
SELECT FILTER
(
Customer.City.City.Members,
([Date].[Calendar].[Calendar Year].[CY 2003],
Measures.[Internet Order Quantity]) > 75
) ON 0
FROM [Adventure Works]
WHERE (Customer.Country.France,
[Date].[Calendar].[Calendar Year].[CY 2004],
Measures.[Internet Sales Amount])
- 上のクエリで、Calendar Year 属性階層の通常の計算コンテキストは CY 2004 ですが、列軸に表示する組のセルの計算コンテキストは、Calendar Year 属性階層の CY 2003 メンバによってフィルタ処理されています。さらに、Internet Order Quantity メジャーによるフィルタ処理も行われています。ただし、列軸のセット メンバがいったん設定されると、列軸に表示されるメンバの値に対する計算コンテキストは、WHERE 句によって決定されます。
重要 |
---|
クエリのパフォーマンスを向上するには、解決プロセスのできるだけ早い段階でメンバおよび組を削除してください。こうすることで、最終的なメンバのセットに対するクエリ時の複雑な計算を、最小限のセルに対して行うことができます。 |
重要 |
---|
式が評価されるパス順序と解決順序は、式の最終的な値に関係があります。これらの値が計算に与える影響の詳細については、「パス順序と解決順序の概要 (MDX)」を参照してください。 |