MDX查询中的SSRS小于运算符

时间:2015-08-07 06:55:17

标签: reporting-services mdx olap ssrs-2012 olap-cube

我想报告小于特定(参数化)日期的日期。但是,运营商不亚于此。

我选择了Range(包含)并检查了参数。我已将文本参数转换为DateTime [根据本文] (https://www.mssqltips.com/sqlservertip/3451/calendar-date-picker-for-mdx-based-sql-server-reporting-services-reports/

这是我查询的一部分。

SELECT (
        STRTOMEMBER(@FromWorkItemSystemCreatedDate, CONSTRAINED) 
        : 
        STRTOMEMBER(@ToWorkItemSystemCreatedDate, CONSTRAINED) 
       ) ON COLUMNS

我隐藏了FromWorkItemSystemCreatedDate参数,并将其默认值设置为最小日期。

当我选择ToWorkItemSystemCreatedDate中不存在的日期时。它给出了错误。 例如我的表有3个项目。他们创建的日期;

01.01.2015,
02.01.2015,
03.01.2015,

当我选择FromWorkItemSystemCreatedDate作为03.01.2015时,它会起作用(返回2个项目)。但是当我选择10.01.2015时,我收到错误,因为没有项目10.01.2015

有没有办法实现“创建日期<参数值”?

1 个答案:

答案 0 :(得分:1)

首先,您需要检查@ToWorkItemSystemCreatedDate参数是否获取"实际"日期。如果它不能使用它,因为该成员不存在。 在这种情况下,您需要选择从@FromWorkItemSystemCreatedDate开始到结尾的所有日期(即空)

WITH MEMBER measures.existingdate as
IIF(
    ISSIBLING    //Check whether the "To" date exists!
        ( 
        STRTOMEMBER(@FromWorkItemSystemCreatedDate, CONSTRAINED),
        STRTOMEMBER(@ToWorkItemSystemCreatedDate, CONSTRAINED)
         ) = True,   
     1,
     NULL
   )

select 
    IIF(
        measures.existingdate = 1,
        STRTOMEMBER(@FromWorkItemSystemCreatedDate, CONSTRAINED) : STRTOMEMBER(@ToWorkItemSystemCreatedDate, CONSTRAINED),
        STRTOMEMBER(@FromWorkItemSystemCreatedDate, CONSTRAINED) : NULL
       ) ON 0,
    {} ON 1
from [YourCube]

修改 以上假设To date始终在范围内或大于最大日期。

但它可能需要一些调整。

  1. 用户意外提供的日期小于日期表中的最小日期。

  2. To Date大于最小日期,小于较大日期但不在范围内。当您的日期表中存在空白时,就会发生这种情况。

  3. 在这种情况下,您应声明一个附加(隐藏)参数,并将其设置为日期表中的最大可能日期。我没有深入研究,因为你已经有了将参数设置为最小日期的逻辑。逻辑几乎是一样的。

    在上述两种情况中,您可能希望引发错误。使用DateDiff函数得出结论。

    让我们说另一个捕获最大创建日期的参数是@FromWorkItemSystemCreatedMaxDate

    完整的查询将是:

    WITH MEMBER measures.existingdate as
    IIF(
        ISSIBLING    //Check whether the "To" date exists!
            ( 
            STRTOMEMBER(@FromWorkItemSystemCreatedDate, CONSTRAINED),
            STRTOMEMBER(@ToWorkItemSystemCreatedDate, CONSTRAINED)
             ) = True,   
         1,
         NULL
       )
    
    MEMBER Measures.IsBackDated AS
    IIF(
        measures.existingdate = NULL AND DateDiff( //Date not in table is lesser than the minimum
                                                 "d", 
                                                 STRTOMEMBER(@FromWorkItemSystemCreatedDate, CONSTRAINED), 
                                                 STRTOMEMBER(@ToWorkItemSystemCreatedDate, CONSTRAINED)
                                                 ) > 0 ,
        1,
        IIF(
            measures.existingdate = NULL AND DateDiff( //Date not in table and is greater than the maximum
                                                 "d", 
                                                 STRTOMEMBER(@ToWorkItemSystemCreatedDate, CONSTRAINED), 
                                                 STRTOMEMBER(@FrontWorkItemSystemCreatedMaxDate, CONSTRAINED)
                                                 ) > 0 ,
            -1, //will return -1 in this case
            2//When the date is greater than minimum, 
             //smaller than maximum(when there are "holes" in dates table)
           )
       )
    
    select 
        IIF(
            measures.existingdate = 1,
            STRTOMEMBER(@FromWorkItemSystemCreatedDate, CONSTRAINED) : STRTOMEMBER(@ToWorkItemSystemCreatedDate, CONSTRAINED),
            IIF( //Nested IIF to check for date greater than max date
                Measures.IsBackDated = -1,
                {STRTOMEMBER(@FromWorkItemSystemCreatedDate, CONSTRAINED) : NULL}, //Measures.IsBackDated = -1
                null
               )
    
           ) ON 0,         
        {} ON 1
    from [YourCube]
    

    您可以自由使用这些度量的值并修改查询以将最合适的消息返回给最终用户,或者您甚至可以考虑更多地修改查询并显示您想要的任何内容。只是我的两分钱。