1

我们有一个包含以下值的表:

项目名称 数量 F 位 日期

项目 1 100 2011 年 1 月 1 日

项目 2 150 2011 年 1 月 5 日

项目 3 200 2011 年 1 月 14 日

项目 4 250 2011 年 1 月 20 日

项目 5 1000 2/1/2011

在 MDX 查询中,我们需要根据日期范围过滤数据。假设我们需要获取日期范围 01/01/2011 到 01/31/2011 的项目及其数量,我们使用以下 MDX 查询:

SELECT 
   NON Empty 
      {[Final Report View For Scorecards].[F Bit Date].Children} ON ROWS, 
   NON Empty 
      {[Measures].[Qty]} ON COLUMNS 
FROM 
  ( 
  SELECT 
     ( 
    {[Final Report View For Scorecards].[F Bit Date].&[2011-01-01T00:00:00] : 
     [Final Report View For Scorecards].[F Bit Date].&[2011-01-31T00:00:00]} 
     ) ON COLUMNS 
  FROM [FinalReportView] 
  )

此处,当 FromDate 和 ToDate 参数作为 01/01/2011 和 01/20/2011 传递时,将正确检索项目 1 到 4 及其各自的数量。但是,当 FromDate 和 ToDate 作为 01/01/2011 和 01/31/2011(或)01/01/2011 和 01/19/2011 传递时,它甚至返回错误的 Item5 的值。即,只有当表中可用的确切日期作为参数传递时,它才会返回正确的结果。但是,当传递了表中不可用的日期时,将返回整个数据集。

使用“过滤器”时也是如此。

任何指向这个问题的指针?

4

1 回答 1

0

如果您使用不存在的成员名称,那么(如果您已将维度的 MdxMissingMemberMode 配置为等效于 的默认设置Ignore),Analysis Services 会将无效的成员名称转换为NULL. 并且范围运算符:解释null为无界,即如果您null在范围的右侧使用,则表示“到关卡的最后一个成员”,在:它的左侧表示“从关卡的第一个成员”。

你能做些什么来解决这个问题:

  • 要么注意只生成现有成员的名称
  • 或者只是用足够大的日期范围来填充维度表,以免引起问题。这些天你不需要添加任何事实,维度表中应该有一个条目。
  • 或者在 MDX 中使用一些字符串逻辑来查找下一个现有的(对于范围的左侧)或上一个现有的(对于范围的右侧)。您可以在 MDX 中使用 VBA 字符串函数。
于 2013-09-18T12:23:53.827 回答