NONEMPTY究竟如何在这里工作?

时间:2012-10-19 14:03:51

标签: sql-server ssas mdx olap

我有一个包含两个度量值组的多维数据集,一个是MOLAP格式,另一个是ROLAP格式。我还从每个成员组中的单个列创建了一个计算成员([C])([A] MOLAP [B] ROLAP < /强>)。我想要的是[C]如果它不为空,则返回[A]的值,否则返回[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]为空)的行
  2. 过滤掉[A][B]为空的所有行
  3. 为什么NONEMPTY仅将[A]加入帐户?

2 个答案:

答案 0 :(得分: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]

答案 1 :(得分:1)

我想知道测量[B]。它是否计算好了?显然,SSAS的默认行为是忽略集合函数中的计算度量。 NONEMPTY是一个set函数。当你在AddCalculatedMembers函数中包装Time维时会发生什么?

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]