MDX where 句の複数ディメンションの制限
-
21-08-2019 - |
質問
次の問題があります。関数であるキー数値を使用して値をクエリする場合、同じディメンション制限の複数の値を指定することはできませんが、関数でない場合は機能します。
したがって、これは機能します:
SELECT {[Measures].[Netto]} on columns FROM TDC where
({NonEmpty([Time].[Month].[Month].&[2008-03-01T00:00:00]),
NonEmpty([Time].[Month].[Month].&[2008-04-01T00:00:00])})
しかし、これはそうではありません:
SELECT {[Measures].[CalculatedFunction]} on columns FROM TDC where
({NonEmpty([Time].[Month].[Month].&[2008-03-01T00:00:00]),
NonEmpty([Time].[Month].[Month].&[2008-04-01T00:00:00])})
そして、これも機能します:
SELECT {[Measures].[CalculatedFunction]} on columns FROM TDC where
({NonEmpty([Time].[Month].[Month].&[2008-03-01T00:00:00])})
解決策はヘッダーに where 句を追加するようなものだと思いますが、この解決策は非常にシンプルなのでとても気に入っています。
計算された関数は次のとおりです。
CREATE MEMBER CURRENTCUBE.[MEASURES].Ultimo
AS (iif ((not [Time].[Year - Month - Date].currentmember is [Time].[Year - Month - Date].defaultmember),
IIF(NOT ([Measures].[LagerStk] = 0),
Sum([Time].[Year - Month - Date].[Date].members(0):
ClosingPeriod([Time].[Year - Month - Date].[Date]),
[Measures].[LagerStk]), NULL)
,
IIF(NOT ([Measures].[LagerStk] = 0),
Sum([Time].[Year - Week - Date].[Date].members(0):
ClosingPeriod([Time].[Year - Week - Date].[Date]),
[Measures].[LagerStk]), NULL))),
VISIBLE = 1;
コードはこれからインスピレーションを得て、時間ディメンションの 2 つの階層に合わせて変更されています。 http://www.sqlserveranalysisservices.com/OLAPPapers/InventoryManagement%20in%20AS2005v2.htm
これは SQL Server 2005 Enterprise エディション上です。
解決
わかりました、これは機能します:
WITH MEMBER [Time].[Month].a AGGREGATE
({[Time].[Month].[Month].&[2008-03-01T00:00:00],
[Time].[Month].[Month].&[2008-04-01T00:00:00]})
SELECT {[Measures].[CalculatedFunction]} on columns FROM TDC where a
他のヒント
問題は計算されたメジャーにあります。.CurrentMember への呼び出しを意味する特定のメンバー参照なしで .CurrentMember と ClosingPeriod を使用しています。WHERE 句に設定した場合、「現在の」メンバーは存在しません。複数の現在のメンバーが存在します。MDX を次のように書き直すと、WHERE 句で複数のメンバーを操作できるようになります。
CREATE
MEMBER CURRENTCUBE.[MEASURES].Ultimo AS NULL;
SCOPE ([MEASURES].Ultimo);
SCOPE ([Time].[Year - Month - Date].[All]);
this = IIF
(
(NOT
[Measures].[LagerStk] = 0)
,Sum
(
NULL:Tail(Existing [Time].[Year - Week - Date].[Date],1).item(0).item(0)
,[Measures].[LagerStk]
)
,NULL
);
END SCOPE;
SCOPE ([Time].[Year - Week - Date].[All]);
this = IIF
(
(NOT
[Measures].[LagerStk] = 0)
,Sum
(
NULL:Tail(Existing [Time].[Year - Month - Date].[Date],1).Item(0).Item(0)
,[Measures].[LagerStk]
)
,NULL
)
);
END SCOPE;
END SCOPE;
2 つのディメンションのすべてのメンバーに対して SCOPE を使用しています。これは出力 IIF よりも高速である必要があり、.CurrentMember への 1 つの参照も回避します。その後、交換しました ClosingPeriod() と電話する Tail(既存の[時刻].[年-週-日].[日付],1).item(0).item(0) これは、現在のコンテキストに存在する日付メンバーのセットを取得することです。次に、Tail() 呼び出しはこれらの最後のメンバーを単一のメンバー セットとして取得し、.Item(0).Item(0) 呼び出しは、そのセットの最初のタプルの最初のメンバー。
明らかに、キューブにアクセスできないので、これをテストすることはできません。コメントで報告された問題は、All メンバーへの誤った参照 (キューブ内の命名形式とは異なる可能性があります) または IIF() ステートメントに関連している可能性があります。0 のチェックが正しいコンテキストで評価されているかどうかわかりません
IIF() を使用せずにテストしてみることもできます
メンバーCurrentCubeを作成します。
スコープ ([対策].Ultimo);SCOPE ([時刻].[年-月-日].[すべて]);this = sum(null:tail(既存の[時間]。終了範囲;
SCOPE ([Time].[Year - Week - Date].[All]);
this = Sum
(
NULL:Tail(Existing [Time].[Year - Month - Date].[Date],1).Item(0).Item(0)
,[Measures].[LagerStk]
);
END SCOPE;
終了範囲;