创建计算的时间段层次结构

时间:2015-02-13 12:17:29

标签: ssas mdx

为了给最终用户提供更好的Cube浏览体验,我正在尝试创建一个由计算成员组成的时间段层次结构。


目前我在DSV中使用了一个计算列来创建一个在我的Dates表中每一行都具有相同值的列(值为All Time)。然后在我的Date and Time维度内,我使用计算列创建了一个单一级别的单个成员层次结构,如下所示:

Screenshot of Single level, single member hierarchy


现在我已成功完成的工作是通过以下计算将时间段添加到Calendar层次结构中:

CREATE MEMBER CURRENTCUBE.[Completion Date].[Calendar].[All].[Last 30 Days]
 AS SUM(LastPeriods(30,StrToMember(
    "[Completion Date].[Calendar].[Day]."+
    "&["+CStr(Year(Now()))+"]&["+CStr(Month(Now()))+"]&["+CStr(Day(Now()))+"]"
))),VISIBLE = 1; 

这在Calendar层次结构上按预期工作:

Screenshot of Calculation working successfully on Calendar Hierarchy

但是我希望将它们移动到新的Time Periods层次结构中以使它们保持良好分离。


到目前为止,我试图以两种不同的方式做到这一点:

  1. 更改计算成员的目标层次结构。将CREATE MEMBER CURRENTCUBE.[Completion Date].[Calendar].[All].[Last 30 Days]更改为CREATE MEMBER CURRENTCUBE.[Completion Date].[Time Period].[All].[Last 30 Days]

  2. Calendar层次结构中计算成员的可见性更改为VISIBLE = 0,并在引用它的Time Periods层次结构上创建第二个计算成员:(我尝试过并且不使用SUM()函数)

  3. CREATE MEMBER CURRENTCUBE.[Completion Date].[Time Period].[All].[Last 30 Days]
     AS SUM([Completion Date].[Calendar].[All].[Last 30 Days]),
    VISIBLE = 1;
    

    但这些都不适合我。所以我的问题是,我怎样才能完成我想要实现的目标?

    我的最终目标是拥有一个层次结构,用户可以将其拖入数据透视表并查看以下内容(但实际计算的时间段):

    Screenshot of Goal

2 个答案:

答案 0 :(得分:3)

我刚刚以这种方式创建:

1)为未过滤的值添加虚拟属性,名称为“All Time”     (键为0,值为0)

2)添加3个空成员

CREATE MEMBER CURRENTCUBE.[Report Date].[Time Period].[All].[Last 30 Days]
 AS 
null,
VISIBLE = 1;
CREATE MEMBER CURRENTCUBE.[Report Date].[Time Period].[All].[Last 60 Days]
 AS 
null,
VISIBLE = 1;
CREATE MEMBER CURRENTCUBE.[Report Date].[Time Period].[All].[Last 90 Days]
 AS 
null,
VISIBLE = 1;

3)比添加范围(我有另一种密钥格式):

/* SCOPES */
SCOPE ([Report Date].[Time Period].[All].[Last 30 Days]);
THIS = Sum(LastPeriods(30,StrToMember("[Report Date].[Report Date].[Day].&["+CStr(Format(Now(),"yyyyMMdd"))+"]")));
END SCOPE;
SCOPE ([Report Date].[Time Period].[All].[Last 60 Days]);
THIS = Sum(LastPeriods(60,StrToMember("[Report Date].[Report Date].[Day].&["+CStr(Format(Now(),"yyyyMMdd"))+"]")));
END SCOPE;
SCOPE ([Report Date].[Time Period].[All].[Last 90 Days]);
THIS = Sum(LastPeriods(90,StrToMember("[Report Date].[Report Date].[Day].&["+CStr(Format(Now(),"yyyyMMdd"))+"]")));
END SCOPE;

它有效(也可以添加一个度量来计算要验证的关卡成员):

LastNDays

答案 1 :(得分:1)

感谢Alex Peshik's Answer我设法让它发挥作用。

以下是我现在用于设置计算时间段层次结构的方法:

  1. 进入您的DSV并在日期表上创建New Named Calculation,其名称为TimePeriod,并将值设置为All Time

    < / LI>
  2. 在日期维度中,从该命名计算中创建一个新属性,并使用它来创建层次结构。

  3. 确保新属性已链接到Attribute Relationships标签中的日属性。

  4. 在您的多维数据集中,转到“计算”标签,并在我们为您要添加的每个时间段制作的Time Period层次结构中创建一个虚拟计算成员:

  5. CREATE MEMBER CURRENTCUBE.[Completion Date].[Time Period].[All].[Last 30 Days]
        AS NULL, VISIBLE = 1;
    CREATE MEMBER CURRENTCUBE.[Completion Date].[Time Period].[All].[Last 60 Days]
        AS NULL, VISIBLE = 1;
    CREATE MEMBER CURRENTCUBE.[Completion Date].[Time Period].[All].[Last 90 Days]
        AS NULL, VISIBLE = 1;
    // etc...
    
    1. 现在位于计算的底部,为我们在上一步中进行的每个虚拟计算添加一个范围(您需要更改StrToMember()函数中的位以匹配您的日期属性Key):
    2. SCOPE ([Completion Date].[Time Period].[All].[Last 30 Days]);
          THIS = SUM(LastPeriods(30, StrToMember(
              "[Completion Date].[Calendar].[Day]."+
              "&["+CStr(Year(Now()))+"]&["+CStr(Month(Now()))+"]&["+CStr(Day(Now()))+"]"
          )));
      END SCOPE;
      
      SCOPE ([Completion Date].[Time Period].[All].[Last 60 Days]);
          THIS = SUM(LastPeriods(60, StrToMember(
              "[Completion Date].[Calendar].[Day]."+
              "&["+CStr(Year(Now()))+"]&["+CStr(Month(Now()))+"]&["+CStr(Day(Now()))+"]"
          )));
      END SCOPE;
      
      SCOPE ([Completion Date].[Time Period].[All].[Last 90 Days]);
          THIS = SUM(LastPeriods(90, StrToMember(
              "[Completion Date].[Calendar].[Day]."+
              "&["+CStr(Year(Now()))+"]&["+CStr(Month(Now()))+"]&["+CStr(Day(Now()))+"]"
          )));
      END SCOPE;