如何使MDX Range运算符限制性更小?

时间:2013-07-12 22:21:00

标签: mdx

我想要过滤日期维度。我使用MDX Range(:)运算符。问题是看起来范围边界必须是集合的有效成员。我在Date维度中有IntDate属性,它是YYYYMMDD格式的整数。当我浏览维度时,有20120705和20120706值,但不是20120704或20120707.尽管就范围而言,20120705:20120706和20120704:20120707都包含20120705和20120706,我希望将返回20120705和20120706。但是当第一个按预期工作时,第二个返回空集。我需要松散范围才能工作的原因是用户可能输入的日期范围不是基于维度中的数据。我怎样才能做到这一点?

有效的: enter image description here

返回空集的那个。 enter image description here

谢谢你, 维拉德。

1 个答案:

答案 0 :(得分:2)

由于您的20130707成员不存在,因此多维数据集无法知道它应该去哪里。

您的日期维度不包含一个月内的所有日期,这似乎很奇怪。我建议重新填充您的日期维度,以便它具有所有日期。如果使用表格多维数据集,则可以从Azure data market获取完全填充的日期维度。如果您使用多维,则可以have SSAS generate one for you。如果您具有基于日期构建的参数,则可以限制列表以填充它们以仅显示使用存在的度量的数据。

我也想知道为什么你希望用户输入日期而不是从有效列表中选择日期。如何在输入完全无效的值时处理错误?似乎最简单/最安全的选择是给他们选择日期列表。如果他们输入的内容没有数据且您有错误处理,则结果应与从有效列表中选择的结果相同。

话虽如此,你应该能够像下面这样的东西。我检查日期是否是有效成员。如果不是我替换我在成员列表中找到的第一个有效成员(您可以选择自己的日期并将其插入那里)。在范围的末尾,我找到了最后一个有效成员(同样,您可以替换自己的值)。

    {Iif(Count(Exists([Date].[Int Date].members, [Date].[Int Date].[20130704]))>0,[Date].[Int Date].[20130704], [Date].[Int Date].firstchild):
 Iif(Count(Exists([Date].[Int Date].members, [Date].[Int Date].[20130707]))>0,[Date].[Int Date].[20130707], [Date].[Int Date].lastchild)}
相关问题