2009-02-04 64 views
0

我是MDX的新手,所以我認爲這是一個新手問題。MDX:過濾不存在​​的成員?

現有尺寸:狀態 現有措施:計數

現有查詢:

SELECT 
    NON EMPTY [status].CHILDREN ON 0, 
    NON EMPTY Measures.count ON 1 
FROM [objects] 

我想和狀態= 'C' 計數的記錄。但有時候,沒有符合該標準的記錄。所以,如果我做的:

SELECT 
    NON EMPTY [status].[C] ON 0, 
    NON EMPTY Measures.count ON 1 
FROM [objects] 

我得到這個錯誤:

*MDX object '[status].[C]' not found in cube 'objects'* 

我想,在這種情況下返回0的查詢。哪種方法可以做到這一點?

謝謝!

回答

2

大多數客戶端應用程序所做的最好的想法是查詢元數據以找出維度中存在哪些成員,然後僅爲存在的成員發出查詢。

下面的文章列出的尺寸元link text

得到的各種方式等「黑客」可能是做到以下幾點:

SELECT 
    NON EMPTY StrToSet("[status].[C]") ON 0, 
    NON EMPTY Measures.count ON 1 
FROM [objects] 

但這仍然不會給你一個0,相反,它會給你沒有列的單元格。這不是我推薦的方法。

2

我從你的問題中假設你的數據源中實際上沒有狀態維度表。相反,您有定義的維度正在使用事實表中的列。這很好用,但它不允許你爲該維度定義一組固定的成員......你基本上堅持你擁有的事實。

解決方案,我看到它的方式是創建一個名爲DimStatus的單獨表,並預先填充您的事實可能使用的所有有效狀態,並讓事實表引用狀態維度表。

然後事情就會按照你想要的方式工作。您可以自動隱藏未使用的成員,也可以包含所有這些成員,或者只包含您想要的成員。

一個需要注意的是,如果沒有匹配的事實,它將顯示(空)而不是0。讓您可以簡單地用IIF(的isEmpty()):

WITH MEMBER 
    [ZeroCount] AS 
     IIF(ISEMPTY([Measures].[Count]), 0, [Measures].[Count]) 
SELECT [ZeroCount] ON COLUMNS, 
[Status].Members on ROWS 
FROM [MyCube] 

這將顯示所有狀態,要麼計數或零。不幸的是,它需要對數據源和多維數據集進行更改,因此希望這是您的一個選擇。

我玩過一些查詢,我不認爲可以更容易地做到這一點。你不能創建一個包含無效成員的集合 - 這會創建無效的元組,並且沒有任何工作會正常工作。我也嘗試過「黑客攻擊」,但沒有按預期工作。