循环上下文和.CurrentMember函数
出了当前单元的上下文,还有但前迭代或循环的上下文。Generate()函数用来提供迭代。聚合函数(如Sum(),Max()等等)同样提供循环上下文,每迭代一次就对表达式求值一次。
例1.
考虑一下的查询,选出一组作品集,这个集计算其[Unit Sales]对其同类最大[Unit Sales]的比例。
with
member [Measures].[Pct of Max Siblings] as
'[Measures].[Unit Sales]/
Max(
[Product].[Category].CurrentMember.Siblings,
[Measures].[Unit Sales]
)
'
select
{[Measures].[Unit Sales], [Measures].[Pct of Max Siblings]}
on axis(0),
{[Product].[Doing].Children} on axis (1)
from Sales
where [Time].[2005]
member [Measures].[Pct of Max Siblings] as
'[Measures].[Unit Sales]/
Max(
[Product].[Category].CurrentMember.Siblings,
[Measures].[Unit Sales]
)
'
select
{[Measures].[Unit Sales], [Measures].[Pct of Max Siblings]}
on axis(0),
{[Product].[Doing].Children} on axis (1)
from Sales
where [Time].[2005]
1)Max()对[Product].[Category]的子成员启动循环,CurrentMember是每循环一次[Category]的一个成员引用,Siblings返回指定成员的同级,包括该成员本身
2)Max()每次循环的单元值为41,808。
例2.
上下文也有嵌套关系。通常情况下,一系列不同的公式同时执行时,会以嵌套上下文来结束。例如有这样的分析需求:选出所包含的月份中各时期增长率至少为13%的季度。
select
filter([Time].[Quarter].members,
Max(
[Time].[YQMD].CurrentMember.Children,
([Time].[YQMD].CurrentMember
/[Time].[YQMD].CurrentMember.PrevMember)
)>=1.13
)
on axis(0)
from Sales
where ([Measures].[Unit Sales], [Product].[Tools])
filter([Time].[Quarter].members,
Max(
[Time].[YQMD].CurrentMember.Children,
([Time].[YQMD].CurrentMember
/[Time].[YQMD].CurrentMember.PrevMember)
)>=1.13
)
on axis(0)
from Sales
where ([Measures].[Unit Sales], [Product].[Tools])
过程分解如下:
1)Filter对所有季度启动循环
2)Max()的第一个参数CurrentMember在这些季度上循环
3)附加的.Children在每个月上启动循环。
4)Max()第二部分的比值表达式和Time.CurrentMember轮流设置每个月。
5)只有当Max()返回的值>=1.13时,则Max() >= 1.13为真。