SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

難解クエリー言語「MDX」に挑戦

多次元データベースクエリー言語「MDX」入門
~計算するメンバー(4)

第4回

1)代表的な計算式の例

 ビジネスシステムで、計算されるメンバーで使用することが多い計算式のサンプルを列挙します。

(1)累計

 月ごとの売上金額と、期首からの売上金額累計を取得するMDXは次のようになります。

例2:月ごとの「売上金額」と、「期首からの売上金額累計」を取得する
WITH MEMBER [Measures].[RUIKEI] AS 
	Sum([URIAGE DATE].[YYYY-MM-DD].[2009年].FIRSTCHILD:
[URIAGE DATE].[YYYY-MM-DD].CurrentMember,
[Measures].[URIKINGAKU])
SELECT {[URIAGE DATE].[YYYY-MM-DD].[2009年].Children } ON COLUMNS, {[Measures].[URIKINGAKU], [Measures].[RUIKEI] } ON ROWS FROM SALES

 実行結果は次のようになります。

実行結果
実行結果

 上段はその月の売上金額、下段はその年度の累計金額です。この例で使用しているのはSUM関数と「:」という演算子です。「:」は範囲を示す演算子で、範囲内の全メンバーを含むセットを返します。

 メンバーA:メンバーB

 と記述することで「メンバーAからメンバーBまでの全メンバー」のセットを取得できます。例2では

「2009年度の最初の月からその月まで」の記述
[URIAGE DATE].[YYYY-MM-DD].[2009年].FirstChild:
[URIAGE DATE].[YYYY-MM-DD].CurrentMember

 の記述で、「2009年度の最初の月からその月まで」を意味します。SUM関数の構文は次回詳述しますが、

「2009年度の最初の月からその月までの売上金額合計」の記述
SUM([URIAGE DATE].[YYYY-MM-DD].[2009年].FirstChild:
    [URIAGE DATE].[YYYY-MM-DD].CurrentMember,
    [Measures].[URIKINGAKU])

 と記述することで「2009年度の最初の月からその月までの売上金額合計」となります。

(2)移動平均、移動合計

 累計は「期首からその月まで」という範囲指定ですが、移動平均や移動合計の場合は「その月(日)までの直近数ヶ月間(数日間)」が計算対象範囲となります。その場合は次のような計算式になります。

例3:直近6か月の「移動平均」を取得する
WITH MEMBER [Measures].[HEIKIN] AS 
	Avg(LastPeriods(6,[URIAGE DATE].[YYYY-MM-DD].CurrentMember),
[Measures].[URIKINGAKU])
SELECT {[URIAGE DATE].[YYYY-MM-DD].[2009年].Children } ON COLUMNS, {[Measures].[URIKINGAKU], [Measures].[HEIKIN] } ON ROWS FROM SALES
「直近6か月」の記述
LASTPERIODS(6,[URIAGE DATE].[YYYY-MM-DD].CURRENTMEMBER)

 が「直近6か月」を意味しています(関数の詳細は次回参照)。

「直近6か月の売上金額の平均」の記述
AVG(LASTPERIODS(6,[URIAGE DATE].[YYYY-MM-DD].CURRENTMEMBER),[MEASURES].[URIKINGAKU])

 で「直近6か月の売上金額の平均」すなわち移動平均となり、AVGSUMに変更すると「直近6か月の売上金額の合計」すなわち移動合計となります。

(3)増加減少率

 ファンチャートなどで使用する増加減少率は次のような計算式で取得します。

例4:「増加減少率」を取得する
WITH MEMBER [Measures].[ZOUKARITSU] AS 
	([URIAGE DATE].[YYYY-MM-DD].CurrentMember,[Measures].[URIKINGAKU]) /
([URIAGE DATE].[YYYY-MM-DD].[2009年].FirstChild,[Measures].[URIKINGAKU])
SELECT {[URIAGE DATE].[YYYY-MM-DD].[2009年].Children } ON COLUMNS, {[Measures].[URIKINGAKU], [Measures].[ZOUKARITSU] } ON ROWS FROM SALES
「期首月を基準としたその月の増減率」の記述
([URIAGE DATE].[YYYY-MM-DD].CurrentMember,[ Measures].[URIKINGAKU]) /
([URIAGE DATE].[YYYY-MM-DD].[2009年].FirstChild,[Measures].[URIKINGAKU])

 という2つのタプルの割り算が「期首月を基準としたその月の増減率」を意味しています。

「前月比」の記述
([URIAGE DATE].[YYYY-MM-DD].CurrentMember,[Measures].[URIKINGAKU]) /
([URIAGE DATE].[YYYY-MM-DD].CurrentMember.PrevMember,[Measures].[URIKINGAKU])

 とすると「前月比」になります。

(4)構成比

 パレート図などで使用する構成比は次のような計算式でも取得できます(CurrentMember.Parentを使わない方法)。

例5:「構成比」を取得する
WITH MEMBER [Measures].[KOSEIHI] AS 
	[Measures].[URIKINGAKU] / 
([SHOHIN].[SHOHINMEI].[ALL],[Measures].[URIKINGAKU])
SELECT {[Measures].[URIKINGAKU], [Measures].[KOSEIHI] } ON COLUMNS, {[SHOHIN].[SHOHINMEI].Children } ON ROWS FROM Sales WHERE [URIAGE DATE].[YYYY-MM-DD].[2008年]

 ([SHOHIN].[SHOHINMEI].[ALL],[Measures].[URIKINGAKU])というタプルが「全商品の売上合計金額」を意味しており、縦軸が[SHOHIN].[SHOHINMEI].Childrenであるため、[Measures].[URIKINGAKU] / ([SHOHIN].[SHOHINMEI].[ALL],[Measures].[URIKINGAKU])と記述することにより、「商品別の売上構成比」を意味することになります。

次のページ
2)データ形式の編集(カンマ区切りなど)

この記事は参考になりましたか?

難解クエリー言語「MDX」に挑戦連載記事一覧

もっと読む

この記事の著者

大家 正巳(オオヤ マサミ)

株式会社ヴィバーク代表取締役。 システムアナリスト。 この度、当社では SQL Server Analysis Services に接続し、MDXの発行が可能な BIシステム構築ツール「CubeWalker」を開発しました。2009年10月より発売致します。 高速かつ安価なBIシステム作りに、是非お...

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/4337 2009/09/30 14:00

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー