如何根据过滤维度创建计算度量?

时间:2012-11-15 09:50:53

标签: ssas mdx sql-server-2012 olap ssas-2012

我对MDX相对较新(在刚刚订购一本书的过程中)并且在创建计算度量方面有一定的瑕疵,应根据设定的日期范围对我的一个Fact表中的值求和(来自我的时间维度)应该由另一个维度的属性过滤。不幸的是,我似乎已经陷入了一种局面,无法看清楚。我查看了其他类似的问题,但没有看到任何尝试做同样的事情,只有单维度量。

我有一个测量组,其中包含物理测量SourceMeasure

我有一个名为[Time]的时间维度,我想用它来指定我的计算范围。这与我的日期密钥相关的上述度量组。

我有一个名为[Dim Account]的帐户维度,其中包含两个日期属性:[Account Start Date][Account End Date]。这通过帐户ID与上述度量组相关。

我要做的是将[Time]维度过滤到基于[Account Start Date][Account End Date]的范围,并返回[SourceMeasure]的总和为该帐户指定的期间。

显然,每个帐户都会有所不同,所以不应该聚合,除了[Dim Account]维度(可能返回0,如果不应用则返回null)。

下面的示例测试表达式,由于FORMAT_STRING语法错误(根据MDX Studio),目前无效。

WITH 
  MEMBER [Measures].[LifetimeMeasure] AS 
    Sum
    (
      {
          StrToMember
          (
        "[Time].[Date].&[" 
            + Format([Dim Account].[Account Start Date].CurrentMember.MemberValue,"yyyy-MM-ddThh:mm:ss")
            + "]"
          )
        : 
          StrToMember
          (
            "[Time].[Date].&[" 
            + Format([Dim Account].[Account End Date].CurrentMember.MemberValue,"yyyy-MM-ddThh:mm:ss")
            + "]"
          )
      }
     ,[Measures].[SourceMeasure]
    ) 
SELECT 
{
    [Measures].[LifetimeMeasure]
    ,[Measures].[SourceMeasure]
}
ON COLUMNS
,{
    [Dim Account].[Account].[AccountName]
} 
ON ROWS
FROM 
    [MyCube]

我尝试过几种不同的方法(SCOPE,Filter,IIF),但每当我似乎回到同一个问题时 - 如何根据[Dim Account]的值过滤[Time]维度开始和结束日期。

现在,我可能完全误解了维度之间的关系是如何工作的和/或SSAS如何计算出计算出的度量,但我还没有达到我确定要寻找什么的水平,所以我围成一圈。

我正在尝试做什么,如果有的话,任何关于在哪里寻找帮助我弄清楚我哪里出错的指针?我是否应该考虑使用计算维度?

我希望这一切都有意义,如果我遗漏了任何内容或需要更多细节,请告诉我。我正在使用MDX Studio进行测试。

1 个答案:

答案 0 :(得分:0)

我通过向StrToMember函数添加CONSTRAINED标志找到了错误。

似乎我的[时间]维度的日期条目默认为时间“00:00:00”,而我的[Dim Account]维度的日期条目默认为“12:00:00”。它看起来像是24小时制和12小时制之间的不匹配。由于维度不是自然时间维度,因此[Dim Account]维度上的我的日期字段标记为“常规”,而不是“日期”。我认为这可能导致不匹配。

要解决此问题,我已从格式表达式中删除了时间格式,并在搜索根本原因时将“00:00:00”附加到字符串。一旦我解决了它,我就会更新。

更新:不匹配的原因不在维度中,而是在StrToMember表达式中使用的格式字符串中。它没有在MSDN上记录,但以下字符串输出12小时时间格式:

"yyyy-mm-ddThh:mm:ss"

此字符串输出24小时时间格式:

"yyyy-mm-ddTHH:mm:ss"