2017-11-27 20 views
1

私のように構造化対策の累積合計があります。現在の日付への最初のアプリケーションの日からスローSSAS累積合計計算されるメジャー

Aggregate (
    { NULL : [Date].[Year - Month - Date].CurrentMember } 
    ,[Measures].[Applications]) 

を、日付範囲の日数は、連続している必要があります。

日付ディメンションには、1900年1月1日〜将来の日付が含まれます。

私は次のように計算された指標を構築することにより、最初のアプリケーション、および将来の日付より前の日付を排除しようとしてきました

CREATE MEMBER CURRENTCUBE.[Measures].[Applications TD] AS 
CASE 
WHEN 
    /* Eliminates dates before first applications, i.e. year 1900-01-01 */ 
    Aggregate (
     { NULL : [Date].[Year - Month - Date].CurrentMember } 
     ,[Measures].[Applications]) < 0 
THEN NULL 
WHEN 
    /* Eliminates dates after today */ 
    [Date].[Year - Month - Date].CurrentMember.MemberValue >= StrToMember('[Date].[Date].&['+Format(Now(),"yyyy-MM-ddT00:00:00")+']').MemberValue 
THEN NULL 
ELSE 
    Aggregate (
      { NULL : [Date].[Year - Month - Date].CurrentMember } 
      ,[Measures].[Applications])   
END 

私が使用して必要な場合にのみ集約することで、これを最適化する試みに成功していませんEXISTS関数とEXCEPT関数などを使用して、case文の代わりにSCOPEを使用します。

キューブをブラウズしてのサイズを[Date].[Year - Month - Date]で定義すると、それは非常に遅いです。

+0

あなたは '集計'を使う必要がありますか、 '合計'を使うのはいいですか? – whytheq

+0

この場合、合計が有効です。 – samb0x

答えて

2

IIFは、一般にCASEよりも速く、SUMは、多くの場合、AGGREGATEよりも速いです。
あなたの主な問題は、membervalueを使用している状態の2番目の部分ですが、それは必須か、それとも同じことをしませんか? :

CREATE MEMBER CURRENTCUBE.[Measures].[Applications TD] AS 
IIF(
    SUM (
     { NULL : [Date].[Year - Month - Date].CurrentMember } 
     ,[Measures].[Applications] 
    ) < 0 
    , NULL 
    , 
    SUM (
     { NULL : [Date].[Year - Month - Date].CurrentMember } 
      ,[Measures].[Applications] 
    ) 
) 

私はカスタム・メンバーとしてこれを分離したい:

CREATE MEMBER CURRENTCUBE.[Date].[Date].[All].[Today] AS //<< a little of syntax for this create 
    StrToMember('[Date].[Date].&['+Format(Now(),"yyyy-MM-ddT00:00:00")+']') 

その後、ネストされたIIFを試してみてください。

CREATE MEMBER CURRENTCUBE.[Measures].[Applications TD] AS 
IIF(
    [Date].[Year - Month - Date].CurrentMember.MemberValue >= [Date].[Date].[All].[Today].MemberValue 
    , NULL 
    , IIF(
     SUM (
      { NULL : [Date].[Year - Month - Date].CurrentMember } 
      ,[Measures].[Applications] 
     ) < 0 
    , NULL 
    , 
    SUM (
      { NULL : [Date].[Year - Month - Date].CurrentMember } 
      ,[Measures].[Applications] 
    ) 
) 
) 

しかし

"Today"メンバで悩むのではなく、isTodayカラムをDimDateに追加すると、より効率的になり、カラムを使用してキューブの日付ディメンションの属性を持つことになります。あなたはこれを単純化できるはずです。[Date].[Year - Month - Date].CurrentMember.MemberValue >= [Date].[Date].[All].[Today].MemberValue

+0

ありがとうございます。この尺度を使って、日付に対するビジュアルを構築して、毎日の累計を確認することができます。 membervalueの2番目の部分がなければ、本質的に今日までの値が2027年まで毎日繰り返されます(DimDateには10年後の日付が含まれます)。おそらくそれはまったく別の質問でしょうか? – samb0x

+0

@ samb0x ok - 私はあなたの問題を理解しました。私たちのキューブはDimDateで昨日までの日付しか持っていません - これが私が理解できなかった理由です。変更はすぐに施行されますか?倉庫/立方体に変更を加えるためのアクセス権がありますか? – whytheq

+0

私はこれのバージョンを実装しましたが、それはすでに大きな改善です。私は "[Date]。[Date]。[All]。[Today]"の構築方法については不明です。今日の日付を持つDimDateに新しい列 "Today"があり、[Date] .CurrentMember.MemberValue> = [Date]。[Today] .item(0).MemberValueこれは動作します"[日付]。[すべて]。[今日]" – samb0x