我正在编写一些MDX,根据两个不同的时间段将维度连接到自身以获取公共列表,然后对这两个列表进行计数。
简而言之,我需要
我尝试过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 / filterSELECT
{
[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函数中被多次使用"
有没有人知道如何解决上述情况?
答案 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中的记录