循环上下文和.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] 

image

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])

image

过程分解如下:

1)Filter对所有季度启动循环
2)Max()的第一个参数CurrentMember在这些季度上循环
3)附加的.Children在每个月上启动循环。
4)Max()第二部分的比值表达式和Time.CurrentMember轮流设置每个月。
5)只有当Max()返回的值>=1.13时,则Max() >= 1.13为真。

posted on 2009-11-23 20:44  一粒沙  阅读(737)  评论(0编辑  收藏  举报