假设我有一张类似
的表格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实现上述功能
答案 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;。这不会影响磁盘空间(仅维度数据),与棘手的逻辑相比,性能下降非常低。