为了给最终用户提供更好的Cube浏览体验,我正在尝试创建一个由计算成员组成的时间段层次结构。
目前我在DSV中使用了一个计算列来创建一个在我的Dates表中每一行都具有相同值的列(值为All Time
)。然后在我的Date and Time
维度内,我使用计算列创建了一个单一级别的单个成员层次结构,如下所示:
现在我已成功完成的工作是通过以下计算将时间段添加到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
层次结构上按预期工作:
但是我希望将它们移动到新的Time Periods
层次结构中以使它们保持良好分离。
到目前为止,我试图以两种不同的方式做到这一点:
更改计算成员的目标层次结构。将CREATE MEMBER CURRENTCUBE.[Completion Date].[Calendar].[All].[Last 30 Days]
更改为CREATE MEMBER CURRENTCUBE.[Completion Date].[Time Period].[All].[Last 30 Days]
。
将Calendar
层次结构中计算成员的可见性更改为VISIBLE = 0
,并在引用它的Time Periods
层次结构上创建第二个计算成员:(我尝试过并且不使用SUM()
函数)
CREATE MEMBER CURRENTCUBE.[Completion Date].[Time Period].[All].[Last 30 Days]
AS SUM([Completion Date].[Calendar].[All].[Last 30 Days]),
VISIBLE = 1;
但这些都不适合我。所以我的问题是,我怎样才能完成我想要实现的目标?
我的最终目标是拥有一个层次结构,用户可以将其拖入数据透视表并查看以下内容(但实际计算的时间段):
答案 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;
它有效(也可以添加一个度量来计算要验证的关卡成员):
答案 1 :(得分:1)
感谢Alex Peshik's Answer我设法让它发挥作用。
以下是我现在用于设置计算时间段层次结构的方法:
进入您的DSV并在日期表上创建New Named Calculation
,其名称为TimePeriod
,并将值设置为All Time
。
在日期维度中,从该命名计算中创建一个新属性,并使用它来创建层次结构。
确保新属性已链接到Attribute Relationships
标签中的日属性。
在您的多维数据集中,转到“计算”标签,并在我们为您要添加的每个时间段制作的Time Period
层次结构中创建一个虚拟计算成员:
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...
StrToMember()
函数中的位以匹配您的日期属性Key):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;