2008-12-15 45 views
0

我遇到以下問題。如果我用一個函數的keyfigure查詢值,我不能指定同一維度限制的多個值,但如果它不是一個函數,它就可以工作。MDX中的多維度限制條款

所以此工程:

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])}) 

我猜的解決方案是一樣的東西加入其中條款的標題,但我真的很喜歡這個解決方案,因爲它非常簡單。

的Calucated功能是:

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; 

的代碼是從這個靈感和修改在時間維度上兩個層次:http://www.sqlserveranalysisservices.com/OLAPPapers/InventoryManagement%20in%20AS2005v2.htm

這是SQL Server 2005企業版。

回答

1

好了,這個工程:

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 
0

的問題是在你的計算度量。您正在使用.CurrentMember和ClosingPeriod,但沒有指定調用.CurrentMember的特定成員參考。當你在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; 

我使用的兩個維度的所有成員範圍內,這應該是快了出來IIF也將避免一個參考.CurrentMember。然後,我將ClosingPeriod()調用與尾(現有[時間]。[年 - 周 - 日期]。[日期],1).item(0).item(0)這是做什麼的在當前上下文中存在的一組日期成員,然後Tail()調用將這些日期成員中的最後一個作爲單個成員集並且.Item(0).Item(0)調用從第一個元組獲取第一個成員那套。

很明顯,無法訪問您的多維數據集,我無法測試任何此類問題。您在評論中報告的問題可能與對所有成員的錯誤引用有關(可能與您的多維數據集中的命名格式不同),也可能與IIF()語句有關。我不知道,對於0檢查是在正確的情況下被評估

你可以嘗試測試沒有IIF()

CREATE MEMBER CURRENTCUBE [措施] .Ultimo爲NULL。

SCOPE([MEASURES] .Ultimo); SCOPE([Time]。[Year - Month - Date]。[All]); this =總和 ( NULL:尾(Existing [Time]。[Year-Week-Date]。[Date],1).item(0).item(0) ,[Measures]。[LagerStk] ); END SCOPE;

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; 

END SCOPE;

+0

對原始描述添加了calucated功能。謝謝! – 2009-02-04 08:19:07