2

あいさつスタックオーバーフローコミュニティ。

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

状況:2つのファクトテーブル、同じキューブ。FactCallsはサブスクライバーによって行われた呼び出しに関する情報を保持し、FactTopupsはtopupデータを保持します。両方のテーブルには多数の共通ディメンションがあり、そのうちの1つはサブスクライバディメンションです。

FactCalls              FactTopups
SubscriberKey SubscriberKey
CallDuration DateKey CallCost
Topup Value .. ..

私が達成しようとしているのは、過去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 
     )

成功せずに。

敬具、

ヴィンス

4

2 に答える 2

2

おそらく、次のようなものの方がパフォーマンスが優れていることがわかります。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] ; 
于 2010-03-22T06:19:27.867 に答える
1

どういうわけかあなたを逃れるのは、最も単純で最も明白な解決策であることがどれほどあるか知っていますか?まあ、これは明らかにそれらの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] ; 

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

于 2010-03-19T17:29:05.993 に答える