创建计算时间段层次结构
Creating a Calculated Time Periods Hierarchy
为了给最终用户更好的 Cube 浏览体验,我正在尝试创建一个由计算成员组成的时间段层次结构。
目前,我在我的 DSV 中使用了一个计算列来创建一个在我的日期 table(值为 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;
但是这些都不适合我。所以我的问题是,我怎样才能完成我想要实现的目标?
我的最终目标是拥有一个层次结构,用户可以将其拖入数据透视表 table 并查看以下内容(但使用实际计算的时间段):
我刚刚以这种方式创建了相同的内容:
1) 为名称为 'All Time' 的未过滤值添加虚拟属性
(键为 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;
有效(还添加了一个度量来计算某个级别的成员数量以进行验证):
多亏了,我才得以成功。
这是我现在用来设置计算时间段层次结构的方法:
进入您的 DSV 并在您的日期 table 上创建一个 New Named Calculation
,名称类似于 TimePeriod
,并将值设置为类似于 [=14] =].
在您的日期维度中,根据该命名计算创建一个新属性,并使用它来创建层次结构。
确保新属性链接到 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()
函数中的位以匹配您的日期属性键):
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;
为了给最终用户更好的 Cube 浏览体验,我正在尝试创建一个由计算成员组成的时间段层次结构。
目前,我在我的 DSV 中使用了一个计算列来创建一个在我的日期 table(值为 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;
但是这些都不适合我。所以我的问题是,我怎样才能完成我想要实现的目标?
我的最终目标是拥有一个层次结构,用户可以将其拖入数据透视表 table 并查看以下内容(但使用实际计算的时间段):
我刚刚以这种方式创建了相同的内容:
1) 为名称为 'All Time' 的未过滤值添加虚拟属性 (键为 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;
有效(还添加了一个度量来计算某个级别的成员数量以进行验证):
多亏了
这是我现在用来设置计算时间段层次结构的方法:
进入您的 DSV 并在您的日期 table 上创建一个
New Named Calculation
,名称类似于TimePeriod
,并将值设置为类似于 [=14] =].在您的日期维度中,根据该命名计算创建一个新属性,并使用它来创建层次结构。
确保新属性链接到
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()
函数中的位以匹配您的日期属性键):
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;