1

MOLAP 形式と ROLAP 形式の 2 つのメジャー グループを持つキューブがあります。[C]また、各メンバー グループ ( [A] MOLAPおよび[B] ROLAP ) の 1 つの列から計算メンバー ( ) を作成しました。私が望むのは、空でない場合は[C]の値を返し、それ以外の場合は を返すことだけです。これは、ステートメントを使用して非常に簡単に実現できます。[A][B]CASE

WITH MEMBER [C] AS
    CASE
        WHEN ISEMPTY([A]) THEN [B]
        ELSE [A]
    END

これはうまく機能し、次のクエリを実行すると、表示されると予想されるのとまったく同じ結果が表示さ[C][B]ます[A]

SELECT
    { [A]
    , [B]
    , [C]
    } ON COLUMNS
    , [Time].CHILDREN ON ROWS
FROM    
    [Cube]

[A]ただし、との両方が空の場合があり、[B]それらを結果セットから除外したいと考えています。通常、これを実現するには、[Time]ディメンションをラップするだけです。NONEMPTY

SELECT
    { [A]
    , [B]
    , [C]
    } ON COLUMNS
    , NONEMPTY([Time].CHILDREN) ON ROWS
FROM    
    [Cube]

[A]しかし、上記のクエリでこれを試すと、空であるかどうかに関係なく、結果は空のすべての行を除外します[B]。が空の行[B]は除外されません。

NONEMPTY は次のいずれかになると思います。

  1. [C]が空である ([A]および空で[B]ある)行のみを除外するOR
  2. [A]OR[B]が空のすべての行を除外します

ここで考慮に入れているのNONEMPTYはなぜですか?[A]

4

2 に答える 2

2

NonEmpty機能とNON EMPTYキーワードがあります。それらは同じ振る舞いをしません。

あなたが書く場合:

NON EMPTY [Time].CHILDREN ON ROWS

空の行を削除します。

このNonEmpty関数は他の軸を考慮していません。h1[A]、[B]、[C]の階層と呼びましょう。あなたの場合、NonEmtpyはのデフォルトメンバーで計算されますh1

あなたの質問のために

NONEMPTY([Time].CHILDREN) ON ROWS

と同等です

NONEMPTY([Time].CHILDREN, {[h1].DefaultMember}) ON ROWS

次のクエリは、何が起こるかを理解するのに役立ちます。

SELECT
    { [A]
    , [B]
    , [C]
    , [A].Hierarchy.DefaultMember
    } ON COLUMNS
    , [Time].CHILDREN ON ROWS
FROM    
    [Cube]
于 2012-10-19T15:42:49.517 に答える
1

[B]の対策が気になります。計算されていますか?どうやら SSAS の既定の動作は、セット関数で計算されたメジャーを無視することです。NONEMPTY はセット関数です。時間ディメンションを AddCalculatedMembers 関数でラップするとどうなりますか?

SELECT
    { [A]
    , [B]
    , [C]
    } ON COLUMNS
    , NONEMPTY(AddCalculatedmeasures([Time].CHILDREN)) ON ROWS
FROM    
    [Cube]

また、NONEMPTY 関数にフィルター処理の対象を明示的に伝えた方がうまくいくのだろうかと思います。おそらく、ROLAP メジャー グループには、[B] が空であっても、時間の経過とともに空にならない他のメジャーが含まれている可能性があります。NONEMPTY と NON EMPTY の違いを思い出してください。

SELECT
    { [A]
    , [B]
    , [C]
    } ON COLUMNS
    , NONEMPTY([Time].CHILDREN, [C]) ON ROWS
FROM    
    [Cube]
于 2012-10-19T15:27:17.847 に答える