MDX クエリ軸とスライサー軸 - クエリ軸のコンテンツを指定する

適用対象: SQL Server Analysis Services Azure Analysis Services Fabric/Power BI Premium

クエリ軸は、多次元式 (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 ステートメントは、COLUMNS 軸で Internet Sales Amount メジャーを返し、MDX の MEMBERS 関数を使って、ROWS 軸で 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 月以降のキューブにはデータがありません。 どの列にもデータがないすべての行をセルセットから削除するには、ROWS 軸のセットの定義の前に、以下のように NON EMPTY を追加します。

SELECT {[Measures].[Internet Sales Amount]} ON COLUMNS,  
NON EMPTY  
{[Date].[Calendar].MEMBERS} ON ROWS  
FROM [Adventure Works]  
  

NON EMPTY は、クエリのすべての軸で使用できます。 以下の 2 つのクエリの結果を比較してみましょう。最初のクエリは NON EMPTY を使っておらず、2 番目のクエリでは両方の軸で使用しています。

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]  
  

参照

スライサー軸の内容の指定 (MDX)