在MDX中过滤多个DateRanges

时间:2015-02-03 13:52:55

标签: ssas mdx

假设我有一张类似

的表格
ID | EntryDate  | ExitDate   | LastSeen   | Sex
---|------------|------------|----------------
1  | 2000-01-23 | 2015-01-18 | 2013-08-01 | M
2  | 2008-01-13 | null       | 2012-06-25 | F
3  | 2014-01-09 | 2014-12-21 | 2014-09-12 | M

我创建了度量和维度作为[度量]。[人物]作为计数(ID) 并且具有3个唯一的日期维度[EntryDate],[ExitDate],[LastSeenDate]和[Day]等级,其格式为' YYYYMMDD' (e.g.:20151231)

我想写的MDX是计算2014年1月1日之前,2013年1月1日之后的最后一次参赛人数,并且还有2013年1月1日之后的退出日期

如果我把它写成sql,语法就是

Select count(ID) from table where entryDate < 20140101 and exitDate > 20130101 and lastseenDate > 20130101;

我的第一次尝试是将MDX写为

With
Set [EnrolDateRange] As Filter([EnrolDate].[Day].Children,[Enrol Date].[Day].CurrentMember.Name < '20140101')
Set [LastSeenDateRange] As Filter([LastSeenDate].[Day].Children,[LastSeen Date].[Day].CurrentMember.Name > '20130101')
Set [ExitDateRange] As Filter([ExitDate].[Day].Children,[ExitDate].[Day].CurrentMember.Name > '20130101')
MEMBER [Measures].[N1] As Aggregate ([EnrolDateRange],[Measures].[People])
MEMBER [Measures].[N2] As Aggregate ([LastSeenDateRange],[Measures].[People])
MEMBER [Measures].[N3] As Aggregate ([ExitDateRange],[Measures].[People])
MEMBER [Measures].[Total] As ([Measures].[N1] + [Measures].[N2] + [Measures].[N3])
Select { [Measures].[Total] } on columns, { [Sex].[Sex].Children } on Rows FROM [Cube]

但是这里的问题是我得到的总数是错误的,因为相同的行将分别为每个条件聚合。

我无法在日期进行交叉加入的原因是因为我有超过60年的数据。

有没有办法使用MDX实现上述功能

1 个答案:

答案 0 :(得分:2)

NULL:(Date)使用<=(Date):NULL使用>=

select [Measures].[People] on 0
from [Cube]
where
(
 {NULL:[EntryDate].[Day].&[20131231]}
 /* not 20140101 because <= */

 ,{[LastSeenDate].[Day].&[20130102]:NULL}
 /* not sure, you mean after including Jan 1st or no */

 ,{[ExitDate].[Day].&[20130102]:NULL} /* the same */
)

一个主要提示:过滤器中的成员必须存在于每个维度中。

E.g。如果此维度中没有[EntryDate].[Day].&[20131231],则服务器将其替换为NULL并且不知道过滤了哪个维度,因为另一个范围部分是我们的查询NULL。结果将是NULL,请小心。

至于我的实践:最好将空成员(没有真实数据)添加到维度而不是开发另一种行为,例如&#34;如果成员不存在,则找到第一个非空成员在它的右侧/左侧&#34;。这不会影响磁盘空间(仅维度数据),与棘手的逻辑相比,性能下降非常低。