2012-10-19 52 views
1

我有一个带有两个度量值组的多维数据集,一个用于MOLAP格式,另一个用于ROLAP格式。我还在每个成员组的单个列中创建了计算成员([C])([A]MOLAP[B]ROLAP)。我只想要[C]返回0123B的值(如果它不是空的),否则返回[B]。这与CASE语句实现很容易地:如何正确无法在此工作?

WITH MEMBER [C] AS 
    CASE 
     WHEN ISEMPTY([A]) THEN [B] 
     ELSE [A] 
    END 

这个伟大的工程,并运行下面的查询显示的结果完全一样我希望要显示他们,其中[C][B]只有当[A]是空的。

SELECT 
    { [A] 
    , [B] 
    , [C] 
    } ON COLUMNS 
    , [Time].CHILDREN ON ROWS 
FROM  
    [Cube] 

然而,也有一些情况下,既[A][B]是空的,我想过滤出来的结果集。通常情况下,我就可以只包住[Time]维度NONEMPTY来实现这一目标:

SELECT 
    { [A] 
    , [B] 
    , [C] 
    } ON COLUMNS 
    , NONEMPTY([Time].CHILDREN) ON ROWS 
FROM  
    [Cube] 

但是当我尝试这与上面的查询,结果过滤掉所有地方[A]是空的,行的,无论[B]是否为空。没有过滤出[B]为空的行。

我预计NONEMPTY要么:

  1. 过滤出行,其中[C]是空的([A][B]是空的)OR
  2. 过滤掉所有行[A][B]是空

为什么NONEMPTY只需要[A] in acc ount这里?

回答

2

还有NonEmpty函数和NON EMPTY关键字。他们没有相同的行为。

如果你写:

NON EMPTY [Time].CHILDREN ON ROWS 

它会删除空行。

NonEmpty函数不考虑其他轴。我们称h1为[A],[B]和[C]的层次结构。在你的情况下,NonEmtpy是在默认成员h1上计算的。

您所查询的

NONEMPTY([Time].CHILDREN) ON ROWS 

相当于

NONEMPTY([Time].CHILDREN, {[h1].DefaultMember}) ON ROWS 

下面的查询应该可以帮助您了解发生了什么:

SELECT 
    { [A] 
    , [B] 
    , [C] 
    , [A].Hierarchy.DefaultMember 
    } ON COLUMNS 
    , [Time].CHILDREN ON ROWS 
FROM  
    [Cube] 
+0

你说得对,'NON EMPTY'是我想要的。但在这种情况下,在同一轴上不是'[A]'和'[B]'?为什么'NONEMPTY'只会过滤出[A]为空的行,而不是'[B]'所在的行? – mclark1129

+0

啊,我现在看到了。 NONEMPTY是FILTER功能的特殊形式。它从第一组中删除第二组中空的项目。如果你没有提供第二套,它只是使用你的立方体的默认度量 - 在这种情况下,[A]。如果您想针对[C]测试NONEMPTY,则必须将[C]放入函数的第二个参数中。 – Bill

1

我想知道Measure [B]。它是计算的吗?显然,SSAS的默认行为是忽略集合函数中的计算度量。 NONEMPTY是一个集合函数。当您将AddCalculatedMembers函数中的时间维度包装起来时会发生什么?

SELECT 
    { [A] 
    , [B] 
    , [C] 
    } ON COLUMNS 
    , NONEMPTY(AddCalculatedmeasures([Time].CHILDREN)) ON ROWS 
FROM  
    [Cube] 

我也想知道,如果它的工作更好,如果你明确告诉它测量过滤过NONEMPTY功能。也许你的ROLAP度量组有其他的措施,即使在[B]的时候也不是空的。请记住NONEMPTY和NON EMPTY之间的区别。

SELECT 
    { [A] 
    , [B] 
    , [C] 
    } ON COLUMNS 
    , NONEMPTY([Time].CHILDREN, [C]) ON ROWS 
FROM  
    [Cube] 
+0

'[B]'不计算,除非它的ROLAP意味着它被视为自动处理的计算结果。没有任何情况下,度量组的一种度量是空的,但另一种则不是。在这种特殊情况下,如果某个度量为空,那是因为整个行不存在于事实表中。我可以像使用第二个例子一样,通过使用'NON EMPTY'以及在'NONEMPTY'中包含'[C]'来实现我正在寻找的功能。我甚至不知道这些选择(MDX的新增功能)。 – mclark1129

+0

我能够实现我现在想要的,但我仍然不确定NONEMPTY只考虑“[A]”的原因。 – mclark1129