[英]Filter on Multiple DateRanges in 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
我已经创建了作为[Measures]。[People]作为Count(ID)的度量和维,并具有3个唯一的日期维[EntryDate],[ExitDate],[LastSeenDate],具有[Day] Level,以'YYYYMMDD'格式表示(例如: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来实现上述目标
将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 */
)
一个重要提示:过滤器中的成员必须存在于每个维度。
例如,如果此维度中没有[EntryDate].[Day].&[20131231]
,则服务器将其替换为NULL,并且不知道要过滤哪个维度,因为另一个范围部分是查询中的NULL。 结果将全部为NULL,请小心。
按照我的做法:将空成员(没有真实数据)添加到维度比开发其他行为(例如“如果成员不存在,请在其右侧/左侧找到第一个非空成员”)更好。 与棘手的逻辑相比,这不会影响磁盘空间(仅影响维度数据),并且性能下降非常低。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.