MDX where子句中的多维限制

时间:2008-12-15 17:59:24

标签: sql-server-2005 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])})

我想解决方案就像在标题中添加where子句,但我真的很喜欢这个解决方案,因为它很简单。

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企业版上。

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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;

我在两个维度的所有成员上使用SCOPE,这应该快于IIF并且也将避免对.CurrentMember的一个引用。然后我用 Tail(现有[时间]。[年 - 周 - 日期]。[日期],1).item(0).item(0)替换 ClosingPeriod()调用这样做是为了获取当前上下文中存在的日期成员集,然后Tail()调用将这些成员的最后一个作为单个成员集和.Item(0).Item(0) )调用从该集合的第一个元组中获取第一个成员。

显然,无法访问您的多维数据集,我无法测试任何此类。您在评论中报告的问题可能与对所有成员的错误引用有关(我可能与您的多维数据集中的成员有不同的命名格式),或者它可能与IIF()语句有关。我不确定是否在正确的上下文中评估0的检查

您可以尝试不使用IIF()

进行测试

CREATE   MEMBER CURRENTCUBE。[MEASURES] .Ultimo AS NULL;

SCOPE([MEASURES] .Ultimo);       范围([时间]。[年 - 月 - 日]。[全部]);         这=总和             (              NULL:Tail(现有[Time]。[Year - Week - Date]。[Date],1).item(0).item(0)              ,[措施]。[LagerStk]             );       结束范围;

  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;

结束范围;