簡単なMDXケースおよび説明(3)

4292 ワード

例四:もう一つのフォーク積の使い方
 SELECT 

 { 

     CROSSJOIN( 

        [Product].[Product Category - Product Class].[ ], 

        [Store].[Store Name].[Store Name] 

      ) 

 } ON COLUMNS, 

 {

     [Store].[Sales Country - Sales Region - Sales District Id - Region].[ ] 

 } ON ROWS 

 FROM [Foodmart ] 

 WHERE [Time By Day].[month_of_year].&[3]


 
例五:第三の叉積用法
 SELECT 

 { 

     [Product].[Product Category - Product Class].[ ] 

 }* 

 { 

     [Store].[Store Name].[Store Name] 

 } 

 ON COLUMNS, 

 { 

     [Store].[Sales Country - Sales Region - Sales District Id - Region].[ ] 

 } ON ROWS 

 FROM [Foodmart ] 

 WHERE [Time By Day].[month_of_year].&[3]


 
例4と例5はいずれもフォーク積の使用方法であり,例3と同様の結果を得ることができる.SSASでは2つの軸以上のクエリーを直接表示することはできませんが、フォーク積を使用して3つの軸以上のクエリーを2つの軸に「平面化」することができます.これにより理論的にはSSASで複数の軸のデータを直接見ることができる.ここで私が「理論的に」と言うのは、フォーク積という演算の複雑さがかなり高いため、複数次元のメタセットをフォーク積すると待ち時間が長くて結果が得られない可能性があり、コンピュータは大量の演算でプログラムを中断することもあるからです.だから実際にはこのような使い方をできるだけコントロールしなければなりません.使用する場合は、まずデータを非常に限られた範囲内に制御し、フォーク積を減らすことによる演算の消込を低減することが望ましい.
 
b)FROM句
FROM句はMDXクエリのソース多次元データセットを表し、FROM句には1つの多次元データセットしか含まれません.つまり、同じMDXクエリは同じ多次元データセットからのみ発生し、SQLクエリのように複数のデータテーブルを接続することはできません.また、MDXのFROM句は、別のMDXクエリから得られるサブ多次元データセットであってもよく、これにより、より複雑なMDXクエリが可能になる.以下の例6に示すように、
例6:サブキューブを含む複雑なクエリー
 SELECT 

 { 

     [Product].[Product Category - Product Class].[ ] 

 }* 

 { 

     [Store].[Store Name].[Store Name] 

 } 

 ON COLUMNS, 

 { 

     [Store].[Sales Country - Sales Region - Sales District Id - Region].[ ] 

 } ON ROWS 

 FROM  

 ( 

     SELECT  

     ( 

        { 

            [Time By Day].[quarter].&[Q1] 

        } 

     ) ON COLUMNS  

     FROM [Foodmart ] 

 )

c)WHERE句
WHERE句のもう一つの名称はスライス軸であり、その名の通り多次元データセットに対してスライスとスライス操作を行い、データセットのサイズを制限する役割を果たす.次の2つの例を見てみましょう.
例7:多次元データセットスライス操作
 SELECT 

 { 

     [Product].[Product Category - Product Class].[ ] 

 }* 

 { 

     [Store].[Store Name].[Store Name] 

 } 

 ON COLUMNS, 

 { 

     [Store].[Sales Country - Sales Region - Sales District Id - Region].[ ] 

 } ON ROWS 

 FROM [Foodmart ] 

 WHERE ([Store].[Store Manager].&[Byrd])

図10:スライスした結果
 
例7では,前述のフォーク積例に基づいてスライス操作を行い,Store ManagerがByrdの範囲内にデータを制限した.例7のクエリの結果データセットは、論理的に3つの軸、すなわち製品ディレクトリ、店舗名、地域番号を含む.スライス後、製品カタログと店舗名の2つの軸が保持され、もう1つの領域はスライス操作でByrdに対応する領域しか残っていないためである.クエリーの結果を図10に示します.
例8:多次元データセットのブロック操作
SELECT 

 NON EMPTY {

      [Product].[Product Category - Product Class].[ ]

 }* 

 { 

     [Store].[Store Name].[Store Name] 

 } 

 ON COLUMNS, 

 NON EMPTY { 

     [Store].[Sales Country - Sales Region - Sales District Id - Region].[ ] 

 } ON ROWS 

 FROM [Foodmart ] 

 WHERE  

 ( 

     [Time By Day].[quarter].&[Q1]:[Time By Day].[quarter].[Q2], 

     [Store].[Store].&[18]:[Store].[Store].&[20], 

     [Product].[Product Category].&[Canned Clams]:[Product].[Product Category].&[Canned Sardines] 

 )

図11:ブロックを切断した結果
 
例8は前フォーク積に基づいてブロック操作を行い,それぞれ時間次元,店舗次元,製品次元に制限を行った.【図11】このMDXクエリの結果を示す図である.
 
d)WITH句
WITH句は、一時的なネーミング計算メンバーおよびネーミングセットを作成するために使用されます.WITH句によって作成されたネーミング計算メンバーとネーミングセットは、WITH句に隣接するMDXクエリに限られ、MDXクエリが終了すると、WITH句によって作成されたネーミング計算またはネーミングセットも無効になります.セッション全体で有効なネーミング計算とネーミングセットを作成する場合は、CREATE MEMBERとCREATE SET文を使用します.
次の例では、テンポラリ・ネーミング計算とテンポラリ・ネーミング・セットの使用方法とクエリーの結果を示します.
例9:一時ネーミング計算と一時ネーミングセットの使用
WITH MEMBER [Measures].[Avg Of Units Shipped] 

 AS ’AVG 

     ( 

        { 

            [Product].[Product].[Product] 

        }, 

        [Measures].[Units Shipped] 

     )’ 

 ,FORMAT_STRING=’###,###,###,##0.00’ 

 SET [CROSSSET_StoreName] 

 AS ’{ 

     [Store].[Store Name].[Store Name].[Store 1] 

 }’ 

 SET [CROSSSET_TIME] 

 AS ’{ 

     [Time By Day].[month_of_year].[month_of_year] 

 }’ 

 SELECT NON EMPTY 

 { 

     [Measures].[Avg Of Units Shipped]  

 } 

 ON COLUMNS, 

 NON EMPTY [CROSSSET_StoreName]*[CROSSSET_TIME] 

 ON ROWS 

 FROM [Foodmart ]




 
 
図12:計算と名前付きセットの一時的な名前付きクエリー結果
 
WITH MEMBER文最後のFORMAT_STRINGはデータ結果をフォーマットするために用いられ,例9では,得られた平均値結果を2桁の小数を保持するようにフォーマットし,千分位分離を行った.他にも、PERCENT、CURRENCYなどが一般的です.