MDX(MultiDimensional eXpressions)とは
MDX(MultiDimensional eXpressions)は、オンライン分析処理(OLAP)データベースの多次元データを操作するためのクエリ言語です。
SQLと共通点も持ちますが、OLAPキューブの構造に特化した問い合わせを行うことができます。また、スプレッドシートの数式に似た構文で計算処理を記述できるのも特徴です。
MDXの背景
MDXは、OLAPキューブに格納された多次元データに対して、柔軟なクエリとデータ操作を行うための専用言語として開発されました。従来の
SQLでも一部の操作は可能ですが、複雑なMDXクエリを
SQLで表現しようとすると、非常に冗長な記述になりがちです。MDXは多くのOLAPベンダーで採用されており、事実上、OLAPシステムの業界標準となっています。
MDXの歴史
MDXは、1997年にMicrosoftによってOLE DB for OLAP仕様の一部として初めて発表されました。これは、
SQL Serverのエンジニアグループによって開発されました。
1998年には、Microsoft OLAP Services 7.0が商用リリースされ、その後、Microsoft Analysis Servicesへと発展しました。OLE DB for OLAP仕様は、Microsoftが所有する仕様でありながら、多くのOLAPベンダーに採用されることになりました。XML for Analysis(XMLA)仕様では、MDXクエリ言語の詳細についてOLE DB for OLAP仕様を参照する形になっています。Microsoft Analysis Services 2005では、サブクエリなどのMDX拡張機能が追加され、Microsoft Excel 2007などの製品でこれらの拡張機能が利用されるようになりました。この拡張されたMDXは、MDX 2005と呼ばれることもあります。
mdXML
2001年には、XMLA評議会によってXML for Analysis(XMLA)標準がリリースされ、その中でクエリ言語としてmdXMLが採用されました。XMLA 1.1仕様では、mdXMLは基本的にXMLの`
`タグでラップされたMDXとして定義されています。
MDXには、主に以下の6つのデータ型があります。
スカラー: 数値や文字列などの単一の値です。リテラルとして直接記述できるほか、MDX関数の戻り値としても得られます。例:数値`5`、文字列`"OLAP"`、`Aggregate(数値)`、`UniqueName(文字列)`など。
ディメンション/階層: OLAPキューブのディメンションは、キューブ内のメジャーや属性を構成する要素です。MDXでは、ディメンション間の依存関係は考慮されず、相互に独立していると見なされます。ディメンションは、レベルを持つ階層構造を持つことがあります。階層は、ディメンション内のレベルをまとめたものです。例:`[Time]`、`.Dimension`、`[Time].[Fiscal]`、`.Hierarchy`など。
レベル: ディメンションの階層構造におけるレベルを指します。例:`[Time].[Fiscal].[Month]`、`.Level`など。
メンバー: ディメンション階層における具体的な要素を指します。例:`[Time].[Fiscal].[Month].[August 2006]`、`[Time].[Fiscal].[2006].[Q3].[August 2006]`、`.PrevMember`、`.Parent`、`.FirstChild`など。同じメンバーでも異なる階層に存在する場合は、それぞれ異なるメンバーとして扱われるため、セットやタプルで区別する必要があります。
タプル: 異なるディメンションのメンバーを順序付けた集合です。例:`([Time].[Fiscal].[Month].[August], [Customer].[By Geography].[All Customers].[USA], [Measures].[Sales])`、`.Item`など。
セット: 同じディメンションまたは階層のタプルを順序付けた集合です。例:`{([Measures].[Sales], [Time].[Fiscal].[2006]), ([Measures].[Sales], [Time].[Fiscal].[2007])}`、`Crossjoin`、`Filter`、`Order`、`Descendants`など。
また、メンバープロパティや、配列など他のデータ型も使用できます。メンバープロパティは、クエリのPROPERTIES句で取得できます。状況に応じて、MDXは他のデータ型も許可します。例えば、配列を`SetToArray`関数内で使用して、ActiveXライブラリ内のユーザー定義関数へ渡すことが可能です。その他、Microsoftの`MeasureGroupMeasures`関数や`KPIValue`、`KPIGoal`関数といったデータ型も存在します。
MDXクエリの例
以下は、基本的なMDXクエリの例です。このクエリは、カリフォルニア州の店舗の2002年と2003年の売上を返します。
mdx
SELECT
{[Measures].[Store Sales]} ON COLUMNS,
{[Time].[2002], [Time].[2003]} ON ROWS
FROM
[Sales]
WHERE
([Store].[California])
この例では、以下の要素が使用されています。
SELECT句: クエリの軸を指定します。この例では、列軸に`[Measures].[Store Sales]`を、行軸に`[Time].[2002]`と`[Time].[2003]`を指定しています。
FROM句: データソースとなるキューブを指定します。この例では、`[Sales]`キューブを指定しています。
WHERE句: スライサー軸を指定します。この例では、`[Store].[California]`を指定しています。
MDXクエリでは、最大128個までの軸を指定できます。2つの軸を作成する場合は、1つが列軸、もう1つが行軸である必要があります。ただし、クエリ内での表示順序は関係ありません。軸が1つだけのクエリを作成する場合は、必ず列軸である必要があります。
まとめ
MDXは、多次元データを扱うための強力なクエリ言語であり、OLAPデータベースの複雑な分析を効率的に行うために不可欠です。この記事を参考に、MDXの基本を理解し、より高度なデータ分析に挑戦してください。
参考文献
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, ISBN 0-471-74808-0
Mosha Pasumansky, Mark Whitehorn, Rob Zare: Fast Track to MDX. ISBN 1-84628-174-1
Larry Sackett: MDX Reporting and Analytics with SAP NetWeaver BW. SAP Press, 2008, 978-1-59229-249-3
外部リンク
* 多次元式 (MDX) リファレンス, Microsoft Docs