タプルとキューブ
ここでは、Business Intelligence MDX におけるその他 2 つの主要な概念であるタプルとキューブを紹介します。
"BI サンプルのアクセス方法" も参照してください。
タプルの概要
タプルは、さまざまなディメンジョンのメンバを組み合わせたものです。各タプルには値が 1 つあります (NULL の場合もあります)。
結果セット内の各データ・セルがタプルです。例えば、以下のクエリを考えてみます。
SELECT MEASURES.[%COUNT] ON 0, homed.city.members ON 1 FROM demomdx
%COUNT
1 Cedar Falls 110
2 Centerville 99
3 Cypress 112
4 Elm Heights 118
5 Juniper 122
6 Magnolia 114
7 Pine 121
8 Redwood 111
9 Spruce 93
このクエリでは、9 個のタプルから成るセットが返されます。例えば、最初のタプルは (City ディメンジョンの) Cedar Falls と (Measures ディメンジョンの) %COUNT を組み合わせたものです。
タプルの作成
タプルは、以下の構文を使用して直接作成することができます。
(member_expr1, member_expr2, member_expr3, ...)
member_expr1、member_expr2、member_expr3 (以降同様) はメンバ式です。
MDX の他の実装では、これらのメンバ式それぞれが、別々のディメンジョンに関連付けられている必要があります。つまり、1 つのタプルに、同じディメンジョンの複数のメンバを含めることはできません。
InterSystems MDX では、1 つのタプル式に、同じディメンジョンの複数のメンバ式を含めることができます。ほとんどの場合、結果は NULL になります。これは、ほとんどの場合にレコードが 1 つのメンバにのみ属するためです。ただし、InterSystems IRIS Business Intelligence では、レベルはリスト値に基づくことができます。つまり、ある 1 つのレコードが複数のメンバに属することができます。例えば、タプル (allerd.soy,allerd.wheat) は、大豆と小麦の両方にアレルギーがあるすべての患者を表します。
完全修飾されたタプルと部分修飾されたタプル
タプルは、完全修飾されていても部分修飾されていてもかまいません。
-
タプル式がキューブ内の各ディメンジョンを参照する場合、そのタプルは完全修飾されています。完全修飾されたタプルは、非常に少数のレコードを参照し、細かすぎて一般的に使用することができません。
-
タプル式がキューブ内の各ディメンジョンを参照しない場合、そのタプルは部分修飾されています。部分修飾されたタプルは、特にクエリで使用されるデータをフィルタ処理するために使用する場合に非常に役立ちます。
タプルが参照するメンバが 1 つだけの場合、タプルはそのメンバと同等になります。例えば、以下の式はどちらも同じデータにアクセスします。
(colord.red) colord.red
式 (colord.red) は、ColorD ディメンジョンの Red メンバを使用するタプル式です。
式 colord.red は、ColorD ディメンジョンの Red メンバを参照するメンバ式です。
それぞれの式は、好きな色が赤の患者にのみアクセスします。
タプルのセット
タプルのセットを作成するには、タプル式のコンマ区切りのリストを中括弧で囲みます。
{tuple_expression1, tuple_expression2, ...}
(MDX の他の実装では、セット内のあらゆるタプルにおいて、各タプルを同じように構築する必要があります。例えば、最初のタプルがその最初のリスト項目にディメンジョン A を使用している場合、他のすべてのタプルも同様にする必要があります。InterSystems MDX には、この制約はありません。)
タプルのセットを作成するために、CROSSJOIN 関数または NONEMPTYCROSSJOIN 関数を使用する方法もあります。以下はその例です。
SELECT MEASURES.[%COUNT] ON 0, CROSSJOIN(gend.gender.MEMBERS,homed.city.members) ON 1 FROM demomdx
%COUNT
1 Female->Cedar Falls 58
2 Female->Centerville 41
3 Female->Cypress 51
4 Female->Elm Heights 53
5 Female->Juniper 58
6 Female->Magnolia 58
7 Female->Pine 64
8 Female->Redwood 58
9 Female->Spruce 47
10 Male->Cedar Falls 52
11 Male->Centerville 58
12 Male->Cypress 61
13 Male->Elm Heights 65
14 Male->Juniper 64
15 Male->Magnolia 56
16 Male->Pine 57
17 Male->Redwood 53
18 Male->Spruce 46
これらのセット式は、以下のように、セット式が許可されている場所であればどこでも使用することができます。
-
クエリの軸として
-
WITH 節の中で
-
セットを使用する MDX 関数への引数として
タプル値
あらゆるタプルには値があります (NULL の場合もあります)。
タプルの値は、以下のように決定されます。
-
システムは、タプル式に使用されているメジャー以外のすべてのメンバに対応する行を、ファクト・テーブル内で検索します。
-
次に、それらの行の値を以下のように検索します。
-
タプル式に特定のメジャーが含まれている場合、システムはファクト・テーブルの該当する行ごとに、そのメジャーの値を検索します。
-
タプル式に特定のメジャーが含まれていない場合は、既定のメジャー (通常、%COUNT) が使用されます。
-
-
システムは、そのメジャーに対して指定されている集約関数を使用して、それらの値をまとめて集約します。
例えば、以下のタプルを考えてみます。
(homed.32006,colord.red,allerd.[dairy products],MEASURES.[avg test score])
このタプルの値を決定するために、システムは、郵便番号 32006 に属し、好きな色が赤で、乳製品にアレルギーがあるすべての患者を、ファクト・テーブル内で検索します。次に、それらの患者の Test Score メジャーの値にアクセスして、それらの値の平均を求めます。
別の例として、(InterSystems MDX で許可されている) 以下のタプルを考えてみます。
(allerd.soy,allerd.wheat)
このタプルの値を決定するために、システムは、大豆と小麦の両方にアレルギーがある患者をカウントします。
最後に、以下のタプルを考えてみます。
(homed.juniper,homed.centerville)
このタプルの値を決定するために、システムは、出身地が Juniper かつ Centerville の患者をカウントします。各患者の出身地は 1 つであるため、このタプルの値は NULL になります。
タプル式の例
タプル式は、1 つのディメンジョンのあらゆる階層内のあらゆるレベルで、メンバを参照できます。以下の (Patients キューブからの) ディメンジョンを考えてみます。このディメンジョンには階層が 1 つあり、そこには 4 つのレベルがあります。
これらのいずれかのレベルのメンバを使用するタプルを作成することができます。例えば、以下のタプル式のいずれかを使用できます。
(aged.[all patients])
(aged.[0 to 29])
(aged.5)
別の例として、上記の式のバリエーションを作成してみましょう。この場合、タプル式に他のディメンジョンのメンバを含めてみます。
(aged.[all patients],gend.male)
(aged.[0 to 29],diagd.asthma)
(aged.5,allerd.soy,colord.red)
タプルのセットをクエリの軸として使用する方法
タプルのセットをクエリの軸として使用できます。以下の例は、最も単純な、1 つのタプルで構成されているセットを示しています。
SELECT MEASURES.[%COUNT] ON 0, (homed.juniper,allerd.wheat,aged.[20 to 29]) ON 1 FROM demomdx
%COUNT
Juniper->wheat->20 to 29 1
以下の例は、クエリの軸として使用されている一連のタプルを示しています。
WITH SET myset AS
'{(homed.[cedar falls],allerd.soy,colord.red),(homed.magnolia,allerd.soy,colord.green),
(homed.34577,allerd.eggs,colord.green)}'
SELECT MEASURES.[%COUNT] ON 0, myset ON 1 FROM demomdx
%COUNT
1 Cedar Falls->soy->Red *
2 Magnolia->soy->Green 1
3 34577->eggs->Green *
別の例として、以下は InterSystems MDX で有効なクエリです。
WITH SET myset AS
'{(homed.[cedar falls],allerd.soy,colord.green),(colord.red,allerd.soy,homed.pine,gend.male)}'
SELECT MEASURES.[%COUNT] ON 0, myset ON 1 FROM demomdx
%COUNT
1 Cedar Falls->soy->Green *
2 Red->soy->Pine->Male *
最後に、以下の例では、単一のディメンジョンを複数回参照するタプルを使用しています。
SELECT MEASURES.[%COUNT] ON 0,
{(allerd.soy,allerd.wheat),(homed.juniper,homed.centerville)} ON 1 FROM demomdx
%COUNT
1 soy->wheat 4
2 Juniper->Centerville *
大豆と小麦の両方にアレルギーがある患者が 4 人います。
出身地が 2 つある患者はいません。
キューブの概要
キューブは、ディメンジョンごとに 1 つの軸 (または、エッジ) を含む多次元構造です。このキューブのセルはタプルです。MDX クエリは、キューブから特定のタプルを取得します。
少なくとも単純な事例では、このキューブを視覚化すると便利です。DemoMDX キューブには、10 個のディメンジョン (Measures ディメンジョンなど) があります。簡略化するために、以下の図では、それらのディメンジョンのうちの 3 つ (HomeD、GenD、および Measures) が示されています。実際に表示されているメジャーは 3 つだけであることに注意してください。
キューブのそれぞれの軸はセグメントに分割されています。セグメントは、対応するディメンジョンの最下位レベルのメンバごとに 1 つです。HomeD 軸の場合、これらのセグメントは City レベルのメンバです。
キューブ内の各セルは、完全修飾されたタプルです。各タプルには、図のように 1 つの値があります。
MDX クエリは、それぞれ値を持つ一連のタプルに対する要求です。以下のクエリを考えてみます。
SELECT CROSSJOIN(MEASURES.[%COUNT],gend.gender.MEMBERS) ON 0, homed.city.MEMBERS ON 1 FROM demomdx
Female Male
1 Cedar Falls 569 571
2 Centerville 625 560
3 Cypress 575 543
4 Elm Heights 545 560
5 Juniper 570 546
6 Magnolia 566 503
7 Pine 562 563
8 Redwood 536 540
9 Spruce 550 516
このクエリでは、システムはキューブ内の該当するタプルを検索し、それらの値を取得します。例えば、最初のタプルは (homed.[cedar falls],gend.female,measures.[%COUNT]) です。このタプルの値は 569 です。
加算によって集約される各メジャー (Age など) は、キューブに直接含まれています。他のメジャーの場合、MDX はキューブの値を使用し、それらをメジャー定義に指定されているとおりに集約します。
例えば、Avg Age メジャーはキューブに直接含まれていませんが、Age メジャーは直接含まれています。Age メジャーに含まれているのは、タプル内に表されているすべての患者の累積年齢です。Avg Age メジャーを計算するために、MDX は Age を %COUNT で除算します。以下のクエリを考えてみます。
SELECT CROSSJOIN(MEASURES.[avg age],gend.gender.MEMBERS) ON 0, homed.city.members ON 1 FROM demomdx
Female Male
1 Cedar Falls 36.90 34.56
2 Centerville 35.98 34.68
3 Cypress 37.02 33.55
4 Elm Heights 36.87 34.05
5 Juniper 38.09 34.26
6 Magnolia 35.64 35.03
7 Pine 36.64 33.38
8 Redwood 36.70 36.52
9 Spruce 37.90 32.93
この例では、2 番目のタプルは (homed.[cedar falls],gend.male,measures.[avg age]) です。この値を取得するために、MDX は (homed.[cedar falls],gend.male,measures.[age]) の値を (homed.[cedar falls],gend.male,measures.[%COUNT]) の値で除算します。上記の結果に示されているように、19734 を 571 で除算すると 34.56 になります。
上位レベルとキューブ・ディメンジョン
ここでは、単一の階層を含むディメンジョンのみを考えてみます。
あらゆるディメンジョンにおいて、対応するキューブの軸に直接表されるのは、最下位のレベルのみです。
例えば、以下の図は、HomeD ディメンジョンのすべてのレベルを示しています。
HomeD 軸に含まれているのは、このディメンジョンのリーフ・メンバのみ、つまり、このディメンジョンの最下位レベルのメンバのみであることに注意してください。上位レベルは、下位メンバの組み合わせで構成されます。例えば、ZIP レベルの各メンバは、City ディメンジョンの 1 つ以上のメンバで構成されています。
ここで、以下のクエリを考えてみます。
SELECT CROSSJOIN(MEASURES.[%COUNT],gend.gender.MEMBERS) ON 0, homed.zip.members ON 1 FROM demomdx
Female Male
1 32006 1,120 1,062
2 32007 536 540
3 34577 1,703 1,609
4 36711 625 560
5 38928 1,114 1,131
このクエリでは、システムはキューブの該当するタプルを検索し、それらの値を取得します。
例えば、最初のタプルは (homed.[32006],gend.female,measures.[%COUNT]) です。メンバ 32006 は、市町村 Juniper および Spruce で構成されています。つまり、タプル (homed.[32006],gend.female,measures.[%COUNT]) は、以下のタプルの組み合わせで構成されています。
-
(homed.[juniper],gend.female,measures.[%COUNT])
-
(homed.[spruce],gend.female,measures.[%COUNT])
これらのタプルの値は、それぞれ 570 と 550 です。%COUNT メジャーは加算によって集約されるため、(homed.[32006],gend.female,measures.[%COUNT]) の値は 1120 です。
キューブ・ディメンジョン内の複数の階層
1 つのディメンジョンに複数の階層が存在する場合があります。複数の階層を持つディメンジョンの場合、キューブの対応する軸には、各階層内の最下位レベルのメンバごとにセグメントが 1 つ含まれます。
以下の理論上のキューブについて考えてみます。
Members of cube 'theoretical':
-----------------------------------------
...
Dimensions
...
Sales Date
H1
Sales Year
Sales Period
Sales Date
H2
Sales Quarter
...
Sales Date ディメンジョンには、2 つの階層が含まれています。階層 H1 には、以下の 3 つのレベルがあります。
-
Sales Year レベル。例えば、このレベルのメンバの 1 つは 1990 です。
-
Sales Period レベル。例えば、このレベルのメンバの 1 つは Jan–1990 です。
-
Sales Date レベル。例えば、このレベルのメンバの 1 つは Jan 3 1990 です。
もう 1 つの階層には、レベルが 1 つだけ含まれています。
この場合、Sales Date 軸には、Sales Date のメンバごとに 1 つのセグメントと、Sales Quarter のメンバごとに 1 つのセグメントが含まれています。以下はその例です。
(スペースの都合で、このキューブの図はタプルに分割されていません。)
例えば、クエリで Sales Quarter レベルが使用されている場合、システムは、その軸の適切な部分を使用して、要求されたタプルにアクセスします。