1

我是 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 的查询。哪个是进行该查询的正确方法?

谢谢!

4

3 回答 3

3

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

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

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

一个警告是,如果没有匹配的事实,它将显示 (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]

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

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

于 2009-04-22T07:44:00.070 回答
2

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

以下文章列出了获取维度元数据链接文本的各种方法

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

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

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

于 2009-02-05T04:17:31.230 回答
0

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

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

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

于 2019-02-19T09:16:28.393 回答