SHOEISHA iD

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

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

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

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

多次元データベースクエリー言語「MDX」入門
~クエリー結果の整形手法(3)

第3回

3)プロパティ表示(コードと名称)

 リレーショナルデータベースを扱いなれた人が多次元データベースを扱おうとする際、戸惑うことの1つに「コードと名称」についての考え方の相違があります。

 リレーショナルデータベースの場合、例えば商品マスタなどの構造は、

 商品コード、商品名、…(その他属性)…

 とすることが圧倒的に多く、データを一意に判断するのはあくまで商品「コード」です。ただし、商品コードだけではそれが何なのかは判断できないことが多く、商品名称を別項目として定義し、「商品名称は商品コードに従属する」という関係を持たせます。

 一方、多次元データベースの場合、キューブ生成する際には「商品名称」などの、クエリー結果に表示させたい項目自身でディメンションを構成します。ここで問題が発生しがちなのがデータの一意性です。キューブにはデータの完璧な整合性が求められるため、例え「名称」であってもメジャー以外の各ディメンション値に重複は許されません。同じ商品名を、複数の商品コードに設定することができないのです。

 この問題を回避するためには、ディメンションの各項目を「コード+名称」のように文字列結合した値にするなどの工夫が必要です。

 なお、名称項目に一意性が保たれている場合は、ディメンションの設定によって「コードでデータの関連付けを行い、表示するのは名称とする」ことが可能です。各コードでディメンションデータを関連付けた後、各ディメンションのNameColumnプロパティにそれぞれの名称項目を指定することで実現できます。

 また、ディメンションを構成する項目はあくまで「コード」とし、それぞれの「名称」をディメンションの「プロパティ」として設定する方法もあります。

 このような場合、ディメンションを構成する項目は名称ではなく、コードになります。例えば、サンプルキューブの[SHOHIN]ディメンションが次のような構成であったとします。

[SHOHIN]ディメンションの構成
[SHOHIN]ディメンションの構成

 ディメンションがこのように「名称」からではなく「コード」で構成されていた場合、MDXの実行結果はどうなるでしょうか? 例として、「商品分類別の売上」を表示してみます。

「商品分類別の売上」を表示
SELECT	{ [Measures].[SURYO]
	} ON COLUMNS,
	{[SHOHIN].[SHOHINBUNRUI - SHOHIN].CHILDREN
	} ON ROWS
FROM	[Sales]
WHERE  ([URIAGE DATE].[YEAR].[2009年])

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

実行結果
実行結果

 このように、各商品分類の「名称」がわからない結果表になってしまいます。実際に欲しいのは次のような表です。

表示したい表
表示したい表

 ビジネスシステムでは、このように「コード」と「名称」を併記した表にしたいことがよくあります。

 このような結果表を得るためには、ディメンションのメンバープロパティをMDXで一緒に取得することが必要です。そのためには、まずキューブの構造として、必要な属性情報がディメンションに含まれていなければいけません。含まれていない場合はディメンション構造を修正し、キューブを再処理します。

 キューブをSQL Server Business Intelligence Development Studioで開き、ソリューションエクスプローラ(画面右側)で当該ディメンションをダブルクリックするとディメンション構造が表示され、メンバープロパティが確認できます。

メンバープロパティを確認
メンバープロパティを確認

 MDXでプロパティを一緒に取得するためには、次のように記述します。

SELECT  { [Measures].[SURYO]
	} ON COLUMNS,
	{[SHOHIN].[SHOHINBUNRUI - SHOHIN].CHILDREN
	} DIMENSION PROPERTIES 
[SHOHIN].[SHOHINBUNRUI].[SHOHINBUNRUICD],
[SHOHIN].[SHOHINBUNRUI].[SHOHINBUNRUIMEI]
ON ROWS FROM [Sales] WHERE ([URIAGE DATE].[YEAR].[2009年])

 これでディメンションのメンバープロパティを取得し、コードと名称を併記した表がクエリー結果となります。

 ただし、SQL Server Management Studio 2005からのMDX発行では、DIMENSION PROPERTIESを正しく指定しても実行結果にはプロパティ値は含まれませんので注意してください。後ほど詳述するADOMD.Net経由の結果セットには含まれますし、この連載の後の回で解説するMDX対応アプリケーション構築ツール「CubeWalker」であれば正常に取得できます。

 メンバープロパティは「コード」に対する「名称」、という利用方法以外でも、例えば商品の色や人物の年齢など、必要に応じてさまざまに使用できます。

まとめ

 今回は、MDXで取得したクエリー結果の整形手法をいくつか解説しました。次回は計算されるメンバーについて解説します。

参考資料

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

連載通知を行うには会員登録(無料)が必要です。
既に会員の方はを行ってください。
難解クエリー言語「MDX」に挑戦連載記事一覧

もっと読む

この記事の著者

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

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

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

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

この記事をシェア

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

イベント

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

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

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

メールバックナンバー