MDX加入相同维度

时间:2017-06-29 03:42:36

标签: join multidimensional-array ssas mdx

我正在编写一些MDX,根据两个不同的时间段将维度连接到自身以获取公共列表,然后对这两个列表进行计数。

简而言之,我需要

  • 获取Period1的Student.UniqueId列表,其中包含一个未设置在Period2数据中的标志(IsValid)
  • 获取Period2
  • 的完整学生列表
  • 加入两个列表并生成两个具有相同计数的记录(每个句点一个)(这些计数将用于每个期间内的计算成员计算)

我尝试过subselect和exists子句带过滤器

SELECT 
{   
    [Measures].[FactStudentCount]
}  on COLUMNS,
{ NONEMPTY
    (
        [TestEvent].[TestEvents].[Name].ALLMEMBERS
        * [TestEvent].[PeriodName].[PeriodName].ALLMEMBERS 
    )                            
}  ON ROWS
FROM ( SELECT ( { 
    exists
    (
        filter([Student].[UniqueId].[UniqueId].MEMBERS
            ,([TestEvent].[Key].&[Period1], [IsValid].[Code].&[Yes]))
        ,
        filter([Student].[UniqueId].[UniqueId].MEMBERS
            ,[TestEvent].[Key].&[Period2])
    )
    }) ON COLUMNS
FROM [MyCube])

...但是这并没有给出正确的结果

(为了获得上下文)我还在where子句

中尝试了类似的exists / filter
SELECT 
{   
    [Measures].[FactStudentCount]
}  on COLUMNS,
{ NONEMPTY
    (
        [TestEvent].[TestEvents].[Name].ALLMEMBERS
        * [TestEvent].[PeriodName].[PeriodName].ALLMEMBERS 
    )                            
}  ON ROWS
FROM [MyCube]
where (
    exists
    (
        filter([Student].[UniqueId].[UniqueId].MEMBERS
            ,([TestEvent].[Key].&[Period1], [IsValid].[Code].&[Yes]))
        ,
        filter([Student].[UniqueId].[UniqueId].MEMBERS
            ,[TestEvent].[Key].&[Period2])
    )
)

...但是,这并没有产生正确的结果

我尝试将过滤语句(在exists中)调整为类似

(filter(existing([Student].[UniqueId].[UniqueId].allmembers),[TestEvent].[Key].CurrentMember.MemberValue = 'Period1'), [IsValid].[Code].&[Yes])
,
(filter(existing([Student].[UniqueId].[UniqueId].allmembers),[TestEvent].[Key].CurrentMember.MemberValue = 'Period2'))

...但是这只返回一行(对于Period1) - 表示它是正确的总数

我也尝试过使用NonEmpty的CrossJoin,但它失败了,因为字段来自同一层次结构 - 消息"密钥层次结构在Crossjoin函数中被多次使用"

有没有人知道如何解决上述情况?

1 个答案:

答案 0 :(得分:0)

这就是我做的事情

NonEmpty(
    NonEmpty(
        {([Student].[UniqueId].[UniqueId].members)},{([TestEvent].[Key].&[Period1], [IsValid].[Code].&[Yes])}
    )
    ,
    {([Student].[UniqueId].[UniqueId].members,[TestEvent].[Key].&[Period2])}
)

这将获取所有Period1元素,IsValid ='Yes',然后'left join'将此与Period2中的记录