MDX:过滤不存在​​的成员?

时间:2009-02-04 14:30:06

标签: mdx

我是MDX的新手,所以我认为这是一个新手问题。

现有维度:状态 现有指标计算

现有查询:

SELECT 
  NON EMPTY [status].CHILDREN ON 0,
  NON EMPTY Measures.count ON 1
FROM [objects]

我想要计算status ='C'的记录。但有时,没有符合该标准的记录。所以,如果我这样做:

SELECT 
  NON EMPTY [status].[C] ON 0,
  NON EMPTY Measures.count ON 1
FROM [objects]

我收到此错误:

*MDX object '[status].[C]' not found in cube 'objects'*

我希望在这种情况下返回0的查询。哪个是查询的正确方法?

谢谢!

3 个答案:

答案 0 :(得分:2)

大多数客户端应用程序所做的最好的想法是查询元数据以找出维度中存在的成员,然后仅对存在的成员发出查询。

以下文章列出了获取维度元数据link text

的各种方法

另一个“黑客”可能是做以下事情:

SELECT
  NON EMPTY StrToSet("[status].[C]") ON 0,
  NON EMPTY Measures.count ON 1
FROM [objects]

但是仍然没有给你0,相反它会给你没有列的单元格。而且这并不是我推荐的方法。

答案 1 :(得分:2)

我从您的问题中假设您实际上没有数据源中的状态维度表。相反,您有一个使用Fact表中的列定义的维度。这很好用,但是它不允许你为那个维度定义一组固定的成员......你基本上都坚持你所拥有的事实。

我认为解决方案的方法是创建一个名为DimStatus的单独表,并使用您的事实可能使用的所有有效状态预先填充它,并使事实表引用Status维度表。

然后事情就会按照你想要的方式运作。您可以自动隐藏未使用的成员,也可以包含所有成员,或者只包含您想要的成员。

一个警告是,如果没有匹配的事实,它将显示(null)而不是0。你可以用一个简单的IIF(ISEMPTY())解决这个问题:

WITH MEMBER
    [ZeroCount] AS
        IIF(ISEMPTY([Measures].[Count]), 0, [Measures].[Count])
SELECT [ZeroCount] ON COLUMNS,
[Status].Members on ROWS
FROM [MyCube]

这将显示所有状态以及计数或零。不幸的是,它需要更改您的数据源和多维数据集,所以希望这是您的选择。

我玩了一些查询,我认为不可能更容易做到这一点。您无法创建具有无效成员的集合 - 这将创建无效的元组,并且没有任何方法可以正常工作。我也试过“黑客”,并没有按预期工作。

答案 2 :(得分:0)

解决方案是使用动态集(CREATE DYNAMIC SET)。这些是根据用户权限评估的。

WITH DYNAMICS SET [MySet] {[status].[C]}    
SELECT
  NON EMPTY [MySet] ON 0,
  NON EMPTY Measures.count ON 1
FROM [objects]

但是如上所述,这只能解决过滤问题,您仍然会错过0轴上要显示的任何成员。