はじめに
MDXは難解で、習得が困難なクエリー言語であると言われています。この連載では、全7回をとおして、難解と言われているMDXを可能な限り短期間で実践で使えるレベルまで習得できるよう、基本的な考え方やよく使う関数などに範囲を限定し、使用例とともに入門編として解説しています。
なお、本記事はマイクロソフト社製SQL Server 2005および2008のAnalysis Servicesを前提として解説しています。MDXにはいわゆる「方言」が多く、記述内容が他の多次元データベース製品に必ずしも適合しない可能性があることをあらかじめご了承ください。
第4回目となる今回は、計算するメンバーについて説明します。
対象読者
- Microsoft SQL Server Analysis Servicesの基礎知識があり、これからMDXを覚えようという方
これまでの連載
必要な環境
- Microsoft SQL Server 2005 Analysis ServicesまたはMicrosoft SQL Server 2008 Analysis Services
計算されるメンバー
キューブ内に存在しているセルの値をそのまま取得・表示するのではなく、何らかの計算を行った結果をクエリー結果として取得したい場合があります。MDXではそのような場合、「計算されるメンバー」を定義して使用します。
構文: WITH MEMBER (定義するメンバー名) AS (メンバーの計算式)
計算されるメンバーの定義はSELECT
句の前に記述します。サンプルキューブから、利益金額(売上金額-原価金額)を取得するMDXを記述してみます。
WITH MEMBER [Measures].[RIEKI]
AS [Measures].[URIKINGAKU]- [Measures].[GENKAKINGAKU] SELECT { [Measures].[RIEKI] } ON COLUMNS, {[SHOHIN].[SHOHIN].CHILDREN } ON ROWS FROM [Sales] WHERE ([URIAGE DATE].[YEAR].[2009年])
このMDXの実行結果は次のようになります。
このように、計算されるメンバーを使用することで、もともとのキューブには存在しない項目を、計算値として取得できます。計算式には別ディメンションのメンバーを指定したタプルや各種関数などを使用してさまざまな計算を行うことができます。例えば、例1のクエリーに商品の売上金額構成比を追加してみます。
WITH MEMBER [Measures].[RIEKI] AS [Measures].[URIKINGAKU]- [Measures].[GENKAKINGAKU] MEMBER [Measures].[KOSEIHI]
AS [Measures].[URIKINGAKU]
/ ([SHOHIN].[SHOHIN].CurrentMember.Parent,[Measures].[URIKINGAKU]) SELECT { [Measures].[RIEKI], [Measures].[KOSEIHI] } ON COLUMNS, {[SHOHIN].[SHOHIN].CHILDREN } ON ROWS FROM [Sales] WHERE ([URIAGE DATE].[YEAR].[2009年])
以下の計算式が、「その商品の売上金額構成比」を意味しています。
[MEASURES].[URIKINGAKU] / ([SHOHIN].[SHOHIN].CurrentMember.Parent,[Measures].[URIKINGAKU])
「. CurrentMember.Parent
」の記述が「自分自身の1つ上の階層のメンバー(この場合は全商品)」を表わす関数であり、[URIKINGAKU]
とタプルにすることで「全商品の合計売上金額」を指定しています(関数の詳しい内容については次回詳述します)。
このように、計算式を正しく指定することにより、さまざまな計算をクエリーに埋め込むことができます。ただし、計算されるメンバーはクエリー発行の都度、計算処理を行うことに気をつけてください。多次元データベースがリレーショナルデータベースより圧倒的に速い理由は、「あらかじめ集計計算処理を行っており、クエリー実行時には結果の値を取得するだけ」だからです。
従って、計算されるメンバーであまりに複雑な計算を数多く記述してしまうと、せっかくの高レスポンスが犠牲になってしまう可能性があるのです。
しかし、だからと言って「クエリーで取得する可能性のある値はすべてキューブのメジャーとしてあらかじめ計算させておくべきだ」ということではありません。メジャー項目数が増えると、今度はキューブの生成時間が長くなり、また生成されるキューブも物理的に肥大化してしまいます。
つまりキューブ設計時に、計算によって取得可能な数値をメジャーとして埋め込んでおくべきか、MDX発行時に計算するメンバーとして実行の都度計算させるかは、「キューブの大きさと生成にかかる時間」と「MDX発行時のレスポンス」のトレードオフ関係を考慮しつつ決定すべきものなのです。