MDX によるサブ選択
質問
スタック オーバーフロー コミュニティにご挨拶します。
最近、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] ;
恥ずかしいほどシンプル。