设置 0 为特定值 MDX 查询

Set 0 for specific value MDX query

我一直在四处寻找答案,但没有找到任何答案。抱歉,如果其他地方已经给出了答案。

这是我的问题:

我有一个计算成员,它是(当前成员的)项目数除以项目总数 (sumitem)。

with 
member 
    sumitem
as 
    SUM ([FailureReason].[FailureReason].[All],[Measures].[Items])
member
    Impact
as
    [Measures].[Items]/[Measures].[SumItem]

但是对于我维度 FailureReason 的特定成员,Impact 的结果必须为 0。所以我尝试添加:

member
    ImpactFinal
as
    iif ([FailureReason].CurrentMember = [FailureReason].[FailureReason].&[127], 
        0, 
        Impact
    )   

我 select 我的数据是这样的:

select 
    {[Measures].[Items],
     ImpactFinal
     } on columns, 
    [FailureReason].members on rows 
from 
    NoOTAR

但是这个维度的每个成员的 ImpactFinal 都为 0,而不是只为这个特定成员获得 0。奇怪的是,如果我用任何其他值替换 0,结果是好的。

尝试

with 
member sumitem
as 
    SUM ([FailureReason].[FailureReason].[All],[Measures].[Items])
member LeaveOut
as 
    [FailureReason].[FailureReason].CurrentMember.Properties("Key")   
member Impact
as
    IIf([Measures].[LeaveOut]= "127", 0, [Measures].[Items]/[Measures].[SumItem])

只需使用

[FailureReason].CurrentMember IS [FailureReason].[FailureReason].&[127]

而不是

[FailureReason].CurrentMember = [FailureReason].[FailureReason].&[127]

它会起作用。

更新:几点提示:

  1. 也没有必要使用SUM函数,因为你可以只定义元组,这对服务器来说就足够了:([FailureReason].[FailureReason].[All],[Measures].[Count])

  2. ImpactFinal计算中检查sumitem除以零的度量是非常合理的。因为一旦应用了一些过滤器,这可能会导致此度量归零和报告中的错误。

  3. 如果您不仅有机会查询,而且有机会更新多维数据集,SCOPE ([FailureReason].[FailureReason].&[127],[Measures].[Impact])THIS = 0 的性能优于其他成员。

祝你好运!

更新以修复总数:

如果总数应为 w/o FailureReason 127,您可以将您的措施替换为:

member Impact
as
iif ([FailureReason].[FailureReason].CurrentMember is [FailureReason].[FailureReason].&[127],
        0,
        [Measures].[Items]
    )

member ImpactFinal
as 
iif ([FailureReason].[FailureReason].CurrentMember is [FailureReason].[FailureReason].[All]
    ,[Measures].[Items]-([FailureReason].[FailureReason].&[127],[Measures].[Items])
    ,[Measures].[Impact])/[Measures].[SumItem]

但是我有另外一个解决方案,可读性更好:

member v2_ImpactUncountableFailure
as
iif ([FailureReason].[FailureReason].CurrentMember.Level.Ordinal=0
or 
[FailureReason].[FailureReason].CurrentMember is [FailureReason].[FailureReason].&[127]

,([FailureReason].[FailureReason].&[127],[Measures].[Items])
,null)

member v2_ImpactFinal
as
([Measures].[Items]-[Measures].[v2_ImpactUncountableFailure])
/
([FailureReason].[FailureReason].[All],[Measures].[Items])

仅使用这两个度量而不是一组度量 sumitemImpactImpactFinal。第一个将显示失败结果 - 127 和总数。第二个从干净的未过滤的度量中减去它,所以最后我们有干净的成员,将 failure-127 归零并更正总数。

如果它不起作用,请告诉我,我已经在我的数据库上进行了测试,一切正常。

一个简单的 CASE 语句可以解决您的问题:试试这个

With 
Member ImpactFinal As 
CASE 
WHEN [FailureReason].[FailureReason].CurrentMember IS [FailureReason].[FailureReason].&[127] THEN 0
ELSE 
[Measures].[Items]
/
([FailureReason].[FailureReason].[All], [Measures].[Items]) 
END
SELECT
{ [Measures].[Items], ImpactFinal } On Columns
[FailureReason].[FailureReason].Members On Rows
From NoOTAR