2009-09-04 4 views
1

商品と時間ディメンションがあり、販売数量のファクトテーブルがある状況があります。時間の経過とともに、製品のビジネスキーを除いて、製品のさまざまな詳細が変更されます。立方体からの私の平らなレポートでは、製品ディメンションの他の部分がどのように表示されているかにかかわらず、「ビジネスキー」レベルにいくつかの集計を含めることにしました。 SQLでsqlのsum over partition文と同様にMDXで集計を行う方法

のようなものとして、これは些細なことになります。

select sum(volume) over (partition by productKey,year) as Total 

は関係なく、私が選択した任意の他の、合計欄には、これらの二つのフィールドだけに集約されるだろう。

MDXでは、私は同じ結果を達成することができましたが、より単純な方法が必要であるようです。

WITH MEMBER Measures.ProductKeyTotal AS 
    'SUM(([Product].[ProductKey],[Time].[Year] 
     ,[Product].[Product Name].[Product Name].ALLMEMBERS 
     ,[Volume Type].[Volume Type Id].[Volume Type Id].ALLMEMBERS) 
     ,[Measures].[Volume])' 
SELECT {[Measures].[Volume],[Measures].[ProductKeyTotal]} ON COLUMNS, 
    NONEMPTYCROSSJOIN ([Product].[ProductKey].[ProductKey].ALLMEMBERS 
     ,[Time].[Time].[Year].ALLMEMBERS 
     ,[Product].[Product Name].[Product Name].ALLMEMBERS 
     ,[Volume Type].[Volume Type Id].[Volume Type Id].ALLMEMBERS) ON ROWS 
FROM [My Cube] 
WHERE ([Product].[Include In Report].&[True]) 

1)私は、合計が正しくない計算されたメンバーにはしたくない行のallmembersが含まれていない場合は、他のすべての次元を無視することを強制するショートカットがそこにあるものあなたは指定しますか?

他の計算メンバーを追加する必要があります。そのうちのいくつかはパラメータを使用します。上の例のメソッドを使用すると、同じものを複製する必要があります複数の場所で、コードは重くなるでしょう。

+0

SQLでは「パーティションバイ」は必要ありませんか?単純な「グループ」は機能します。 –

+0

私は、粒度が混在した複数の集約がある場合にパーティションを使用します。それ以外の場合は、グループ化が簡単になります。 – Peter

答えて

2

まず、NonEmptyCrossJoin --itはdeprecatedです。 non empty、次にcross join演算子(*)を使用します。

タプルとタプルセットがどのように質問に答えるかを理解することが重要です。基本的に、明示的に記載されていない次元は、常にとなり、与えられた次元のCurrentMemberが得られます。通常、これはDefaultMemberですが、クエリ内の別のものに設定すると、これが変更されます。これらのディメンションにALLMEMBERSを指定する理由は、CurrentMemberを使用するためです。 ALLMEMBERSを集計しようとする代わりに[All]メンバーを使用することができます(特に平坦でない場合は特に!)。これにより、より良いパフォーマンスが得られます。

これを実行する最も効果的な方法は、別のメジャーグループをキューブに追加し、そのメジャーグループからメジャーに適用されないキーを削除することです。この方法では、実行時の計算ではなく、これらのためのネイティブ計算を行います(特に、キューブ内のすべてを追加する場合は遅くなる傾向があります)。さらに、そのメジャーグループにいくつかの集約設計を設定することもでき、非常に効果的です。

+0

NonEmptyCrossJoinを使用していたのは、あまりにも多くのディメンションを持ち込んだ場合、レポートサービスがあまりに多くのタプルエラーで爆発するためです。その問題を解決したようだった。 別のメジャーグループを追加する際の問題は、より細かい集約に対して既に使用しているファクトテーブルを使用できないことです。私は自分のファクトテーブルのクエリに基づいて別のテーブルを追加しようとしますが、ビジネスキーと年だけを集計する必要があるため、難しいかもしれません。 – Peter

関連する問題