質問

スタック オーバーフロー コミュニティにご挨拶します。

最近、SSAS2008 で OLAP キューブの構築を開始しましたが、行き詰まってしまいました。誰かが少なくとも私を正しい方向に向けてくれれば幸いです。

状況:2 つのファクト テーブル、同じキューブ。FactCalls は加入者による通話に関する情報を保持し、FactTopups はトップアップ データを保持します。両方のテーブルには多数の共通ディメンションがあり、そのうちの 1 つはサブスクライバー ディメンションです。

ファクトコール             ファクトトップアップ
サブスクライバーキー サブスクライバーキー
CallDuration DateKey
通話料金トップアップ値 ...

私が達成しようとしているのは、過去 7 日以内にアカウントにチャージした個別の加入者に基づいて FactCalls レポートを作成できるようにすることです。

私が基本的に探しているのは、SQL と同等の MDX です。

select *  
  from FactCalls  
 where SubscriberKey in 
       ( select distinct SubscriberKey from FactTopups where ... );  

SubscriberKeyを含む両方のテーブルに縮退ディメンションを作成して次のことを試してみました。

Exist( 
         [Calls Degenerate].[Subscriber Key].Children, 
         [Topups Degenerate].[Subscriber Key].Children 
     )

成功せずに。

敬具、

ヴィンス

役に立ちましたか?

解決

おそらく、次のようなものの方がパフォーマンスが向上することがわかります。フィルター アプローチでは各サブスクライバーを反復処理する必要がありますが、NonEmpty() 関数はストレージ エンジンの最適化を利用できます。

select non empty{ 
        [Measures].[Count], 
        [Measures].[Cost], 
        [Measures].[Topup Value] 

      } on columns, 
      { 
NonEmtpy( [Subscriber].[Subscriber Key].Children,     
            ( [Measures].[Topups Count],     
              [Topup Date].[Calendar].[Month Name].&[2010]&[3] ) )
   } on rows 
 from [Calls] ; 

他のヒント

最も単純で明白な解決策が、どういうわけかあなたには見つからないことがあります。まあ、どうやらこれもそのうちの1つです。「MDX は SQL ではない」と言われますが、その意味が分かりました。私は完全に SQL の観点からこれに取り組んできましたが、filter コマンドの明白な使用法を完全に見落としていました。

with set [OnlyThoseWithTopupsInMarch2010] as
    filter( 
            [Subscriber].[Subscriber Key].Children, 
            ( [Measures].[Topups Count], 
              [Topup Date].[Calendar].[Month Name].&[2010]&[3] ) > 0 
          )

select non empty{
        [Measures].[Count],
        [Measures].[Cost],
        [Measures].[Topup Value]

      } on columns,
      non empty{ [Test] } on rows
 from [Calls] ; 

恥ずかしいほどシンプル。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top