3

我有一个 MDX 查询,它返回 2 个不同的值,查找总数和查找失败的次数(以及其他一些东西,但这是重要的部分)。

    with
    member [Pct Success] as 'iif(isempty([Num Lookup]) or [Num Lookup]=0, null, 
        100 * (coalesceempty([Num Lookup] - [Num Failed], 0) / [Num Lookup]))'
select
    {
        [Measures].[Pct Success],
        [Measures].[Num Lookup],
        [Measures].[Num Failed]
    } on 0,
[Calendar].[Date].children on 1
from
    [Cube]

现在我要做的是获得另一个成功测量,但我希望这个测量能够抑制任何低于特定阈值的 [Num Failed] 单元格。具体来说,如果我至少有 4 次成功查找(Num Lookup - Num Failed > 3 && Num Lookup > 4),那么我想让该单元格的 [Num Failed] = 0(或者更确切地说,我想复制 [Num Failed] = 0,因为我仍然需要显示原始的 % Success 度量)。

基本事实看起来像这样(只是列的相关子集 - Line 列是为了便于参考,它不在实际事实中):

线 | 日历键 | 数失败 | 号码查找
 1 | 20130601 | 2 | 8
 2 | 20130601 | 5 | 8
 3 | 20130601 | 1 | 8
 4 | 20130601 | 0 | 7
 5 | 20130601 | 7 | 8
 6 | 20130602 | 2 | 6
 7 | 20130602 | 1 | 7
 8 | 20130602 | 5 | 10
 9 | 20130602 | 7 | 9
 等等

基于上述事实,我期望看到的结果是:

         | % 成功 | % 过滤成功 | 数字过滤失败 | 数失败 | 号码查找

20130601 | 61.53 | 69.23 | 12 | 15 | 39

20130602 | 53.13 | 71.88 | 9 | 15 | 32

在上述事实样本中,第 1、3、4、7 和 8 行的过滤失败值均为 0,这为我们提供了上面列出的样本输出。

我最初的想法是使用 with 子句中的另一个成员作为 [Num Failed] 的副本,然后使用单元格计算来进行抑制,但我无法让单元格计算正常工作 - 它要么不修改值,或者在评估过程中出错。

这是“应该”返回我正在寻找的内容的非工作版本,但没有:

with
    member [Measures].[Num Threshold Failure] AS [Num Failed]
    Cell Calculation [Data Filter] For '[Measures].[Num Threshold Failure]' AS 'NULL', Condition = 'CalculationPassValue((([Measures].[Num Lookup] - [Measures].[Num Failure]) < 4) AND ([Measures].[Num Lookup] > 4), 1)'
    member [Pct Success] as 'iif(isempty([Num Lookup]) or [Num Lookup]=0, null, 100 * (coalesceempty([Num Lookup] - [Num Failed], 0) / [Num Lookup]))'
    member [Pct Filtered Success] as 'iif(isempty([Num Lookup]) or [Num Lookup]=0, null, 100 * (coalesceempty([Num Lookup] - [Num Threshold Failure], 0) / [Num Lookup]))'
select
    {
        [Measures].[Pct Success],
        [Measures].[Pct Filtered Success],
        [Measures].[Num Threshold Failure],
        [Measures].[Num Failed],
        [Measures].[Num Lookup]
    } on 0,
    { [Calendar].[Date].children } on 1
from
    [Cube]
4

1 回答 1

3

我没有详细了解您的问题,但据我了解,以下应该回答它,或者至少接近:

with
member [Pct Success] as iif([Measures].[Num Lookup]=0,
       null, 
       100 * (coalesceempty([Measures].[Num Lookup] -[Measures]. [Num Failed], 0) / [Measures].[Num Lookup]))
member [Filtered Failed] as iif([Measures].[Num Lookup] - [Measures].[Num Failed] > 3 and [Measures].[Num Lookup] > 4),
        0,
        [Measures].[Num Failed])
member [Bottom Filtered failed] as Sum(Leaves(),
       iif([Measures].[Num Lookup] - [Measures].[Num Failed] > 3 and [Measures].[Num Lookup] > 4),
        0,
        [Measures].[Num Failed]))
member [Pct Filtered Success] as iif([Measures].[Num Lookup]=0,
       null, 
       100 * (coalesceempty([Measures].[Num Lookup] -[Measures]. [Filtered Failed], 0) / [Measures].[Num Lookup]))
select
    {
        [Measures].[Pct Success],
        [Measures].[Num Lookup],
        [Measures].[Num Failed],
        [Measures].[Num Filtered Failed],
        [Measures].[Bottom Filtered Failed],
        [Measures].[Pct Filtered Success]
    } on 0,
    [Calendar].[Date].children on 1
from [Cube]

顺便说一句:除非您的目标是 MDX 的 SQL Server 2000 方言,否则您不需要将成员定义包含在 WITH 子句中的单引号中。而且,根据MDX 处理器前首席开发人员的这篇博客文章,您可以将检查空和空值简化为只检查零。

编辑:

正如您所说,用户希望在假设分析中使用几种不同的公差,如果您的立方体不是很大,您可以做什么,并且不同公差的数量只是少数,您可以预先计算假设情况,从而利用 Analysis Services 对聚合值的快速响应时间。

为此,您将按照以下步骤进行:构建一个小的维度表,例如 dim_tolerance,其中包含例如数字 0 到 10,或数字 0、1、2、3、5、8、10 和 12,或任何使感觉。然后构建一个新的事实表,引用与当前维度相同的维度,加上新的维度,并使用根据 dim_tolerance 值计算的单个度量 [num failed filtered] 填充它。然后,您可以从主事实表中删除 [num failed] 度量(因为它与容差为 0 的 [num failed filtered] 相同)。使新维度中的属性不可聚合,默认值为 0。

于 2013-08-06T10:44:29.583 回答