MDX (問い合わせ言語)

MDXは、データベース管理システムを使用したオンライン分析処理の問い合わせ言語である。SQLと共通点が多い、OLAPキューブ用の問い合わせ言語である。また、スプレッドシートの数式に似た構文を持つ計算言語でもある。

1. 背景
-----

MultiDimensional eXpressions言語は、OLAPキューブに格納されている多次元データを照会および操作するための特殊な構文を提供する。 これらの一部を従来のSQLに変換することも可能だが、その場合は非常に単純なMDX文の場合でも不格好なSQL文の合成が必要になることが多い。MDXは多くのOLAPベンダーに採用されており、事実上、OLAPシステムの業界標準ともいえる。

2. 歴史
-----

MDXは、1997年にMicrosoftからOLE DB for OLAP仕様の一部として初めて紹介された。これはMosha Pasumanskyを含むSQL Serverエンジニアのグループによって発明されたもの。 これに続いて1998年にMicrosoft OLAP Services 7.0が商用リリースされ、その後、Microsoft Analysis Servicesがリリースされた。OLE DB for OLAP仕様の最新バージョンは、1999年にMicrosoftから発表されている。

これはオープンな仕様ではなく、Microsoftが所有する仕様であったものの、さまざまなOLAPベンダーによって採用された。

XML for Analysis仕様ではMDX問い合わせ言語の詳細については、OLE DB for OLAP仕様を参照していた。Analysis Services 2005では、Microsoftは副問い合わせのようなMDX問い合わせ言語拡張をいくつか追加した。 Microsoft Excel 2007などの製品は、これらの新しいMDX問い合わせ言語拡張機能を使用し始めた。 MDXのこの新しいものをMDX 2005と呼ぶ人もいる。

2.1. mdXML
----------

2001年、XMLA評議会は問い合わせ言語としてmdXMLを含むXML for Analysis標準をリリースした。 XMLA 1.1仕様では、mdXMLは基本的にXML タグでラップされたMDXである。

3. MDX データ型
-----------

MDXには主に6つのデータ型がある。

スカラー - スカラーは数値または文字列。リテラルとして指定できる。例として数値5や文字列"OLAP"のようなリテラル、あるいは Aggregate 、 UniqueName 、 .Value のようなMDX関数の戻り値など。
ディメンション/階層 - OLAPキューブのディメンション。ディメンションは、キューブ内のメジャーや属性情報を構成するもの。MDXはディメンション間の依存関係を認識、想定せず、それらが相互に独立しているとみなす。ディメンションには、レベルを含むいくつかの階層または階層に編成されたいくつかのメンバーが含まれ、一意の名前で指定できる。例として [Time] あるいは .Dimension のようなMDX関数の戻り値。階層はOLAPキューブのディメンション階層であり、一意の名前で指定できる。例として [Time].[Fiscal] あるいは .Hierarchy のようなMDX関数の戻り値。階層はディメンション内に含まれる。
レベル - レベルはディメンション階層のレベルであり、一意の名前で指定できる。例として [Time].[Fiscal].[Month] のような一意な値、あるいは .Level のような関数の戻り値。
メンバー - メンバーはディメンション階層のメンバーであり、一意の名前で指定できる。例として [Time].[Fiscal].[Month].[August 2006] 、 [Time].[Fiscal].[2006].[Q3].[August 2006] のような修飾名、あるいは .PrevMember, .Parent, .FirstChild のようなMDX関数の戻り値。すべてのメンバーは階層ごとに固有のものであることに注意。同一のものが2つの異なる階層のメンバーである場合、セットとタプルで調整する必要のある2つの異なるメンバーが表示される可能性がある。
タプル - タプルは、異なるディメンションの1つ以上のメンバーの順序付けられた集まりである。タプルはメンバーを列挙することで指定できる。例として  あるいは .Item のようなMDX関数の戻り値。
セット - セットは、同じディメンション、またはMicrosoftの実装の場合は階層のタプルの順序付けられた集まりである。タプルを列挙して指定できる。例として {, } あるいは Crossjoin 、 Filter 、 Order 、 Descendants のようなMDX関数の戻り値など。
その他のデータ型 - メンバープロパティは、データウェアハウスの意味での「属性」に相当する。これらは、クエリの軸のPROPERTIES句を使用して、クエリの文内の名前で取得できる。一部のメンバーのメンバープロパティのスカラーデータ値は、プロパティに名前を付けるか、または特別なアクセス関数を使用することでMDXからアクセスできる。状況によっては、MDXは他のデータ型も許可する。例として配列を SetToArray 関数内で使用して、MDXによって処理されずにActiveXライブラリ内のユーザー定義関数へ渡される配列を指定できる。その他、Microsoftの MeasureGroupMeasures 関数のメジャーグループ名やMicrosoftの KPIValue や KPIGoal 関数といったデータ型もある。

4. 例文
-----

次の例は、SQL Server 2000 Books Onlineを応用したもので、SELECTステートメントを使用する基本的なMDXクエリ。このクエリは、カリフォルニア州の店舗の2002年および2003年の店舗売上を含む結果セットを返す。 SELECT { [Measures].[Store Sales] } ON COLUMNS, { [Date].[2002], [Date].[2003] } ON ROWS FROM Sales WHERE 

この例では、クエリは次の結果セット情報を定義する。

SELECT句は、クエリの軸をメジャーディメンションのStore Salesメンバー、および日付ディメンションの2002年、2003年メンバーとして設定する。
FROM句は、データソースがSalesキューブであることを示す。
WHERE句は、「スライサー軸」をStoreディメンションのカリフォルニア州メンバーとして定義する。注意：MDXクエリでは、最大128のクエリの軸を指定できる。

2つの軸を作成する場合、1つは列軸で、もう1つは行軸である必要があるが、クエリ内での表示順序は関係ない。軸が1つだけのクエリを作成する場合、それは列軸でなければならない。特定のオブジェクト識別子を囲む角括弧は、識別子が予約語でなく、文字、数字、またはアンダースコア以外の文字を含まない限り、オプションである。

SELECT [Measures].[Store Sales] ON COLUMNS, [Date].Members ON ROWS FROM Sales WHERE 

5. 脚注
-----

6. 参考文献
-------

George Spofford, Sivakumar Harinath, Chris Webb, Dylan Hai Huang, Francesco Civardi: //MDX-Solutions: With Microsoft SQL Server Analysis Services 2005 and Hyperion Essbase//. Wiley, 2006,
Mosha Pasumansky, Mark Whitehorn, Rob Zare: //Fast Track to MDX//.
Larry Sackett: //MDX Reporting and Analytics with SAP NetWeaver BW//. SAP Press, 2008, 978-1-59229-249-3

7. 外部リンク
--------

[1], Microsoft Docs より