1

MDXクエリに問題があり、集計と計算されたメンバーの計算の優先順位に要約すると思います。

基礎となるデータから始めましょう。これは、評価(日付、およびメンバータイプ、スキームなどのその他のデータ、そしてこの質問にとって非常に重要な負荷係数)と関連する値を中心に展開します。

データ

評価表

Id | Valuation Date | Member Type | Scheme   | Loading Factor
=============================================================
1  | 2010-01-01     | TypeA       | Scheme X | 0.02
2  | 2010-01-01     | TypeB       | Scheme X | 0.02
3  | 2010-01-01     | TypeA       | Scheme Y | 0.02
4  | 2010-01-01     | TypeB       | Scheme Y | 0.02

ValuationValueテーブル

ValuationId | Value
====================
1           | 1000.0
2           | 2000.0
3           | 3000.0
4           | 4000.0

これは、キューブにロードされると、MemberType、Scheme、およびdateの属性を持つ評価ディメンションを持ちます。そして、次のように、Valueメジャーを含むMeasureグループValuationValueと、LoadingFactorを含むValuationメジャーグループを持つキューブ:

Cube
 -Measure Groups
  - Valuation
    |_Loading Factor
  - ValuationValue
    |_Value
 - Dimensions
  - Valuation
    |_MemberType
    |_Scheme
    |_Date

質問

負荷率は値をロードするために使用されます。これは税金のように考えてください。したがって、0.02は「ロード量が値の2%である」ことを意味します。クエリからValueを返す場合、この値をロードする量も計算する必要があります。典型的なクエリは次のようになります

SELECT
{
 [Measures].[Value] 
} ON 0,
[Valuation].[Scheme] ON 1
FROM Cube

これにより2行が返され、上記のデータと比較するとわかるように、memberType全体で正しく合計されます。

Scheme   | Value
=================
Scheme X | 3000.0
Scheme Y | 7000.0

さて、そのクエリで負荷率を計算しようとすると、すべてがうまくいきません-デモンストレーションします。次のクエリが与えられます:

WITH MEMBER [Measures].[Loading Value]
AS
(
   [Measures].[Value] * [Measures].[Loading Factor]
)
SELECT
{
 [Measures].[Value] ,
 [Measures].[Loading Value]
} ON 0,
[Valuation].[Scheme] ON 1
FROM Cube

結果が出ます

Scheme   | Value  | Loading Value
=================================
Scheme X | 3000.0 | 120.0
Scheme Y | 7000.0 | 280.0

1000 * 0.02 + 2000 * 0.02 = 60基本的に、何が起こっているのかというと、それは私の負荷係数を合計し、それを私の値の合計で乗算しているということです(上の最初の行は計算しているはずです3000 * 0.04 = 120)。

これはもちろん不自然な例です。私の実際の構造はもう少し複雑ですが、これは問題を示していると思います。上記の例で計算されたメンバーは、値メジャーの集計の最後ではなく、行ごとに発生する必要があるという印象を受けました。

返信ありがとうございます。

4

3 に答える 3

0

あなたの[測定値]。[負荷率]-そのセットはどのようになっていますか、それはSUMですか?

計算されたメンバーは、通常、覚えている場合は返される行に従って行われます-特に指定しない限り。

例が必要な場合は、通貨換算ウィザードの出力を確認してください。これは、LEAVESコマンドを使用して同様のことを行います。ただし、MDXスクリプトでSCOPEコマンドとしてこれを行う必要があります。

説明が与えられると、コードは次のようになります。

CREATE MEMBER [Measures].[Loading Value] AS NULL

Scope( { [Measures].[Loading Value] } );   

    Scope( Leaves([Valuation]) );                                         

            This = [Measures].[Value] * [Measures].[Loading Factor]                                  
            Format_String(This) = "#,##0.00;-#,##0.00";                                                                                

    End Scope;   
End Scope;  
于 2010-10-29T12:05:06.757 に答える
0

あなたの例に完全に従っているかどうかはわかりませんが、計算の順序を操作するために SOLVE_ORDER と SCOPE_ISOLATION を使用してみてください。

例えば、

と
 MEMBER [メジャー].[カスタム計算] AS
   '([測定値].[販売数] - [測定値].[返品単位])',
   SOLVE_ORDER = 65535、SCOPE_ISOLATION = CUBE
 選択する
 {[メジャー].[カスタム計算]} 列で、
 NON EMPTY [Time].[YQMD].[Day].AllMembers ON ROWS
 FROM [ウェアマート]
于 2010-11-02T02:17:32.597 に答える
0

これらは本当に簡単ではないことが判明しました。

WITH MEMBER [Measures].[Loading Value]
AS
(
   [Measures].[Value] * [Measures].[Loading Factor]
)
WITH MEMBER [Measures].[Total Loading Value]
AS
SUM (
  EXISTING [Valuation].[Id].[Id],
  [Measures].[Loading Value]
)
SELECT
{
 [Measures].[Value] ,
 [Measures].[Measures].[Total Loading Value]
} ON 0,
[Valuation].[Scheme] ON 1
FROM Cube
于 2010-11-02T15:43:05.780 に答える