Ssas 如何在MDX查询中抑制单个单元格值?

Ssas 如何在MDX查询中抑制单个单元格值?,ssas,mdx,Ssas,Mdx,我有一个MDX查询,它返回两个不同的值,总的查找次数和失败的查找次数(以及其他一些内容,但这是重要的部分) 现在我想做的是获得另一个成功度量,但我希望这个度量能够抑制任何低于特定阈值的[Num Failed]单元格。具体来说,如果我至少有4次成功的查找(Num Lookup-Num Failed>3&&Num Lookup>4),那么我希望使该单元格的[Num Failed]=0(或者更确切地说,我希望复制[Num Failed]=0,因为我仍然需要显示原始的成功百分比度量值) 基本事实如下所示

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

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

基本事实如下所示(只是相关列的子集-行列是为了便于参考,它不在实际事实中):

行| CalendarKey | Num失败| Num查找 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 等 基于上述事实,我希望看到的结果是:

| % Success | % Filt Success | Num Filt Failed | Num Failed | Num Lookup 20130601 | 61.53 | 69.23 | 12 | 15 | 39 20130602 | 53.13 | 71.88 | 9 | 15 | 32 |%Success |%Filt Success | Num Filt失败| Num失败| Num查找 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]
与
成员[Measures].[Num Threshold Failure]为[Num Failed]
“[Measures].[Num Threshold Failure]”的单元格计算[Data Filter]为'NULL',条件='CalculationPassValue(([Measures].[Num Lookup].[Num Failure])<4)和([Measures].[Num Lookup]>4),1)'
成员[Pct Success]为“iif(isempty([Num Lookup])或[Num Lookup]=0,null,100*(coalesceempty([Num Lookup]-[Num Failed],0)/[Num Lookup])”
成员[Pct筛选成功]为“iif(isempty([Num Lookup])或[Num Lookup]=0,null,100*(coalesceempty([Num Lookup]-[Num Threshold Failure],0)/[Num Lookup])”
选择
{
【措施】【Pct成功】,
[措施][Pct筛选成功],
[Measures]。[Num Threshold Failure],
[度量值][Num失败],
[度量值][Num查找]
}0,,
{[Calendar][Date].children}在1上
从…起
[立方体]

我不完全理解你的问题,但据我所知,以下几点应该可以回答,或者至少可以接近:

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]
顺便说一句:您不需要在WITH子句中以单引号包含成员定义,除非您的目标是使用MDX的SQL Server 2000方言。 根据这一点,您可以将空和空的检查简化为只检查零

编辑:

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


要做到这一点,您将按照以下步骤进行:构建一个小尺寸表,比如dim_公差表,其中包含e。G数字0到10,或数字0、1、2、3、5、8、10和12,或任何有意义的数字。然后构建一个新的事实表,引用与当前维度相同的维度,再加上新维度,并使用按照dim_公差值计算的单个度量值[num failed filtered]填充它。然后可以从主事实表中删除[num failed]度量值(因为它与[num failed filtered]相同,公差为0)。将新维度中的属性设置为不可聚合,默认值为0。

请发布您对计算成员的操作?使用另一个计算成员(可能是某个次要成员)听起来应该可以工作:)@Meff在一个非工作查询中添加,显示了我的目标。@FrankPI没有达到我期望的效果。我认为IIF只是在汇总发生后才检查这些条件,所以它永远不会发生(在我的例子中,我汇总了大量数据,所以我的[Num失败了]任何给定的一天的平均值约为30k。好的,在这种情况下,最好的解决方案是将
过滤失败
实现为物理度量。例如,您可以在数据源视图中构建命名计算,然后在此基础上进行度量。可以在基础数据上实现计算,然后进行聚合,但分析服务速度较慢s、 这将是一个问题,因为数据使用者希望能够对过滤后的版本进行假设分析并更改阈值。我们的速度有多慢?我们可以预先计算其中一些字段吗?我需要使用的几个MDX查询正在为异步报告供电,所以30-60秒的运行时间不是一个大问题e、 我编辑了我的答案并添加了一个
[Bottom filtered failed]
度量值。这能满足您的需要吗?将[Bottom]成员添加到查询中会将其从第二个或两个查询更改为运行至少15分钟并在服务器上占用40+GB的RAM(在我取消之前)。我认为这行不通。
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]
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]