MDX

时间:2015-06-26 23:21:18

标签: mdx

我的情况是我需要在特定日期获得有效帐户。

我在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])
       )

此代码仅在日期级别上使我完美,但是一旦我遍历周或月,它就会考虑整个活跃值的月份。但在选定的月份期间,许多帐户都会停用。  如果有人像之前那样面对这种措施 “特定日期的有效价值”。

2 个答案:

答案 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需要是类型成员。因此,请使用TailHead来抓住第一个和最后一个成员:

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
    )