MDX 查询中的 s-s-rS 小于运算符

Posted

技术标签:

【中文标题】MDX 查询中的 s-s-rS 小于运算符【英文标题】:s-s-rS Less Than Operator in MDX Query 【发布时间】:2015-08-07 06:55:16 【问题描述】:

我想报告小于特定(参数化)日期的日期。但不亚于运算符。

我选择了范围(包括)并检查了参数。我已将文本参数转换为 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】:

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

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始终在范围内或大于最大日期。

但这可能需要一些调整。

    用户意外给出的日期小于日期表中的最小日期。

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

在这种情况下,您应该声明一个附加(隐藏)参数并将其设置为日期表中的最大可能日期。我不会深入探讨,因为您已经具备将参数设置为最小日期的逻辑。逻辑几乎相同。

在上述两种情况下,您可能都想引发错误。使用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]

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

【讨论】:

以上是关于MDX 查询中的 s-s-rS 小于运算符的主要内容,如果未能解决你的问题,请参考以下文章

s-s-rS mdx 报告:在列上使用维度

SQL 子查询大于/小于运算符

数据库中的条件查询

在 MDX (s-s-rS) 中执行钻取/在一个一致的维度上连接两个事实表

使用计算成员传递参数 - MDX

MDX 子选择与性能问题