クエリ軸の内容の指定 (MDX)
クエリ軸は、多次元式 (MDX) の SELECT ステートメントから返されるセルセットの範囲を指定します。セル セットの範囲を指定することで、返されるデータのうち、クライアントで表示するデータを限定できます。
クエリ軸を指定するには、<SELECT query axis clause> を使用して特定のクエリ軸にセットを割り当てます。それぞれの <SELECT query axis clause> の値によって、1 つのクエリ軸を定義します。データセットの軸の数は、SELECT ステートメントの <SELECT query axis clause> 値の数と同じです。
クエリ軸の構文
<SELECT query axis clause> の構文は以下のとおりです。
<SELECT query axis clause> ::=
[ NON EMPTY ] Set_Expression [ <SELECT dimension property list clause> ] [<HAVING clause>]
ON {
Integer_Expression |
AXIS( Integer_Expression ) |
{COLUMNS | ROWS | PAGES | SECTIONS | CHAPTERS}
}
各クエリ軸には番号が付いており、0 は X 軸、1 は Y 軸、2 は Z 軸のようになっています。<SELECT query axis clause> の構文では、Integer_Expression の値によって軸の番号を指定します。MDX クエリでは、最大 128 個まで軸を指定できます。ただし、5 つを超える軸を使用する MDX クエリはほとんどありません。最初の 5 つの軸については、COLUMNS、ROWS、PAGES、SECTIONS、CHAPTERS という別名を使用することも可能です。
MDX クエリは、クエリ軸をスキップできません。つまり、1 つ以上のクエリ軸を含むクエリでは、番号の小さい方の軸または中間の軸を除外できません。たとえば、クエリで COLUMNS 軸を除外して ROWS 軸を指定することや、ROWS 軸を除外して COLUMNS 軸と PAGES 軸を指定することはできません。
ただし、軸を指定しない SELECT 句、つまり空の SELECT 句は指定できます。この場合、すべてのディメンションがスライサー ディメンションになり、MDX クエリは 1 つのセルを選択します。
前のクエリ軸の構文では、Set_Expression の値によって、クエリ軸の内容を定義するセットを指定します。セットの詳細については、「メンバ、組、およびセットの操作 (MDX)」を参照してください。
例
次の簡単な SELECT ステートメントは、列軸に対して Internet Sales Amount メジャーを返し、MDX MEMBERS 関数を使用して、行軸の Date ディメンションに対して Calendar 階層のすべてのメンバーを返します。
SELECT {[Measures].[Internet Sales Amount]} ON COLUMNS,
{[Date].[Calendar].MEMBERS} ON ROWS
FROM [Adventure Works]
次の 2 つのクエリは、まったく同じ結果を返しますが、別名ではなく軸番号を使用していることを示しています。
SELECT {[Measures].[Internet Sales Amount]} ON 0,
{[Date].[Calendar].MEMBERS} ON 1
FROM [Adventure Works]
SELECT {[Measures].[Internet Sales Amount]} ON AXIS(0),
{[Date].[Calendar].MEMBERS} ON AXIS(1)
FROM [Adventure Works]
セットの定義の前に NON EMPTY キーワードを使用すると、すべての空の組を軸から容易に削除できます。たとえば、ここまでの例では、2004 年 8 月以降はキューブ内にデータがありません。列にデータがないすべての行をセルセットから削除するには、次のように、行軸の定義のセットの前に NON EMPTY を追加します。
SELECT {[Measures].[Internet Sales Amount]} ON COLUMNS,
NON EMPTY
{[Date].[Calendar].MEMBERS} ON ROWS
FROM [Adventure Works]
NON EMPTY は、クエリのすべての軸で使用できます。次の 2 つのクエリ (NON EMPTY を使用していないクエリと、両方の軸で使用しているクエリ) の結果を比較してください。
SELECT {[Measures].[Internet Sales Amount]}
* [Promotion].[Promotion].[Promotion].MEMBERS
ON COLUMNS,
{[Date].[Calendar].[Calendar Year].MEMBERS} ON ROWS
FROM [Adventure Works]
WHERE([Product].[Subcategory].&[19])
SELECT NON EMPTY {[Measures].[Internet Sales Amount]}
* [Promotion].[Promotion].[Promotion].MEMBERS
ON COLUMNS,
NON EMPTY
{[Date].[Calendar].[Calendar Year].MEMBERS} ON ROWS
FROM [Adventure Works]
WHERE([Product].[Subcategory].&[19])
HAVING 句を使用して、特定の条件に基づいて軸の内容をフィルター処理できます。この方法は、FILTER 関数などの、同じ結果を得ることができる他の方法よりも柔軟性は劣りますが、より容易に使用できます。Internet Sales Amount が $15,000 を超える日付のみを返す例を次に示します。
SELECT {[Measures].[Internet Sales Amount]}
ON COLUMNS,
NON EMPTY
{[Date].[Calendar].[Date].MEMBERS}
HAVING [Measures].[Internet Sales Amount]>15000
ON ROWS
FROM [Adventure Works]