MDX:筛选不使用';不存在?

MDX:筛选不使用';不存在?,mdx,Mdx,我是MDX新手,所以我认为这是一个新手问题 现有维度:状态 现有度量值:计数 现有查询: SELECT NON EMPTY [status].CHILDREN ON 0, NON EMPTY Measures.count ON 1 FROM [objects] 我要清点状态为class='C'的记录。但有时,没有符合该标准的记录。因此,如果我这样做: SELECT NON EMPTY [status].[C] ON 0, NON EMPTY Measures.count O

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

现有维度:状态 现有度量值:计数

现有查询:

SELECT 
  NON EMPTY [status].CHILDREN ON 0,
  NON EMPTY Measures.count ON 1
FROM [objects]
我要清点状态为class='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的查询。哪种查询方式正确


谢谢

最好的方法是查询元数据,找出维度中存在哪些成员,然后只查询存在的成员,这也是大多数客户端应用程序所做的

下面的文章列出了获取维度元数据的各种方法

另一个“黑客”可能是执行以下操作:

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

但这仍然不会给您一个0,而是给您一个没有列的单元格集。我并不推荐这种方法。

最好的方法是查询元数据,找出维度中存在哪些成员,然后只对存在的成员进行查询,这是大多数客户端应用程序所做的

下面的文章列出了获取维度元数据的各种方法

另一个“黑客”可能是执行以下操作:

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

但这仍然不会给您一个0,而是给您一个没有列的单元格集。这并不是我真正推荐的方法。

根据您的问题,我假设您的数据源中实际上没有状态维度表。相反,您定义了一个使用事实表中的列的维度。这很好,但它不允许您为该维度定义一组固定的成员…您基本上被现有的事实所困扰

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

然后事情就会按照你希望的方式进行。您可以自动隐藏未使用的成员,也可以包含所有成员,或仅包含一组您想要的成员

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

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


我玩了一些查询,我认为这不可能更容易做到。您不能创建一个包含无效成员的集合——这将创建无效的元组,任何东西都不能正常工作。我还尝试了“hack”,但没有按预期工作。

根据您的问题,我假设您的数据源中实际上没有状态维度表。相反,您定义了一个使用事实表中的列的维度。这很好,但它不允许您为该维度定义一组固定的成员…您基本上被现有的事实所困扰

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

然后事情就会按照你希望的方式进行。您可以自动隐藏未使用的成员,也可以包含所有成员,或仅包含一组您想要的成员

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

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


我玩了一些查询,我认为这不可能更容易做到。您不能创建一个包含无效成员的集合——这将创建无效的元组,任何东西都不能正常工作。我还尝试了“hack”,但没有按预期工作。

解决方案是使用动态集(创建动态集)。这些将根据用户权限进行评估

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

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

解决方案是使用动态集(创建动态集)。这些将根据用户权限进行评估

WITH DYNAMICS SET [MySet] {[status].[C]}    
SELECT
  NON EMPTY [MySet] ON 0,
  NON EMPTY Measures.count ON 1
FROM [objects]
但如上所述,这只解决了过滤问题,仍然会遗漏任何要显示的o轴0的成员