我的情况是我需要在特定日期获得有效帐户。
我在SQL中的开始日期结束日期看起来像是
select count(account) where start_date <=@date and end_date >=@date
在MDX中,我尝试了一下
AGGREGATE(
{
NULL:LINKMEMBER
(
[DATE].[YQMWD].CURRENTMEMBER
, [StartDate].[YQMWD]
)
}
*
{
LINKMEMBER
(
[DATE].[YQMWD].CURRENTMEMBER
, [EndDate].[YQMWD]
):NULL
}
, ([Measures].[AccountCount])
)
此代码仅在日期级别上使我完美,但是一旦我遍历周或月,它就会考虑整个活跃值的月份。但在选定的月份期间,许多帐户都会停用。 如果有人像之前那样面对这种措施 “特定日期的有效价值”。
答案 0 :(得分:1)
我考虑了以下内容但后来注意到您正在处理两个不同的维[StartDate]
和[EndDate]
,因此使用范围运算符:
是不正确的:
AGGREGATE(
UNION(
{
NULL
:
LINKMEMBER(
[DATE].[YQMWD].CURRENTMEMBER
, [StartDate].[YQMWD]
)
}
,{
LINKMEMBER(
[DATE].[YQMWD].CURRENTMEMBER
, [EndDate].[YQMWD]
)
:
NULL
}
)
, ([Measures].[AccountCount])
)
如果我们查看LINKMEMBER
的定义,那么它会说明以下内容:
https://msdn.microsoft.com/en-us/library/ms146058.aspx
LinkMember函数返回指定的成员 与指定的每个级别的键值匹配的层次结构 相关层次结构中的成员。每个级别的属性必须具有 相同的密钥基数和数据类型。在不自然的等级中,如果有的话 对于属性的键值是多个匹配,结果将是 是一个错误或不确定。
因此,您遇到的行为是有道理的 - 如果[DATE].[YQMWD].CURRENTMEMBER
是一周,那么该成员的关键字不会映射到[StartDate].[YQMWD]
或[EndDate].[YQMWD]
。
此外,如果选择了一周,那么你如何解释这个sql
逻辑where start_date <=@date and end_date >=@date
,因为一周由7天组成,所以@date有7种可能性?
也许您可以在EXISTS
函数中使用LINKMEMBER
函数,以便仅使用日期级别成员。然后我们遇到这个问题,Exists
将返回一个集合类型,但LINKMEMBER
的第一个arg需要是类型成员。因此,请使用Tail
和Head
来抓住第一个和最后一个成员:
AGGREGATE(
{
NULL
:
LINKMEMBER(
HEAD(
EXISTS(
[DATE].[YQMWD].CURRENTMEMBER
,[DATE].[YQMWD].[Date] ////<<if CURRENTMEMBER is a week then Exists will return a set of 7 Date members
)
,1 ////<<if CURRENTMEMBER is a week then Head(..1) will return a set of 1 Date member - the first date in the week
).ITEM(0).ITEM(0) ////<<this converts from single member set to a member
, [StartDate].[YQMWD]
)
}
*
{
LINKMEMBER(
TAIL(
EXISTS(
[DATE].[YQMWD].CURRENTMEMBER
,[DATE].[YQMWD].[Date]
)
,1
).ITEM(0).ITEM(0)
, [EndDate].[YQMWD]
)
:NULL
}
, ([Measures].[AccountCount])
)
答案 1 :(得分:0)
首先检查输入类型然后给出结果怎么样?在这种情况下,CoalesceEmpty
将检查并返回结果。使用FirstChild
函数始终从范围中获取第一个日期。
CoalesceEmpty
(
AGGREGATE
(
{NULL:LINKMEMBER([DATE].[YQMWD].CURRENTMEMBER.FIRSTCHILD.FIRSTCHILD.FIRSTCHILD.FIRSTCHILD, [StartDate].[YQMWD])}
*
{LINKMEMBER([DATE].[YQMWD].CURRENTMEMBER.FIRSTCHILD.FIRSTCHILD.FIRSTCHILD.FIRSTCHILD, [EndDate].[YQMWD]):NULL}
, ([Measures].[AccountCount])
)//--If it is a year
,
AGGREGATE
(
{NULL:LINKMEMBER([DATE].[YQMWD].CURRENTMEMBER.FIRSTCHILD.FIRSTCHILD.FIRSTCHILD, [StartDate].[YQMWD])}
*
{LINKMEMBER([DATE].[YQMWD].CURRENTMEMBER.FIRSTCHILD.FIRSTCHILD.FIRSTCHILD, [EndDate].[YQMWD]):NULL}
, ([Measures].[AccountCount])
)//--If it is a quarter
,
AGGREGATE
(
{NULL:LINKMEMBER([DATE].[YQMWD].CURRENTMEMBER.FIRSTCHILD.FIRSTCHILD, [StartDate].[YQMWD])}
*
{LINKMEMBER([DATE].[YQMWD].CURRENTMEMBER.FIRSTCHILD.FIRSTCHILD, [EndDate].[YQMWD]):NULL}
, ([Measures].[AccountCount])
)//--If it is a month
,
AGGREGATE
(
{NULL:LINKMEMBER([DATE].[YQMWD].CURRENTMEMBER.FIRSTCHILD, [StartDate].[YQMWD])}
*
{LINKMEMBER([DATE].[YQMWD].CURRENTMEMBER.FIRSTCHILD, [EndDate].[YQMWD]):NULL}
, ([Measures].[AccountCount])
)//--If it is a week
,
AGGREGATE
(
{NULL:LINKMEMBER([DATE].[YQMWD].CURRENTMEMBER, [StartDate].[YQMWD])}
*
{LINKMEMBER([DATE].[YQMWD].CURRENTMEMBER, [EndDate].[YQMWD]):NULL}
, ([Measures].[AccountCount])
)//--If it is a date
)