设置 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]
它会起作用。
更新:几点提示:
也没有必要使用SUM
函数,因为你可以只定义元组,这对服务器来说就足够了:([FailureReason].[FailureReason].[All],[Measures].[Count])
在ImpactFinal
计算中检查sumitem
除以零的度量是非常合理的。因为一旦应用了一些过滤器,这可能会导致此度量归零和报告中的错误。
如果您不仅有机会查询,而且有机会更新多维数据集,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])
仅使用这两个度量而不是一组度量 sumitem
、Impact
、ImpactFinal
。第一个将显示失败结果 - 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
我一直在四处寻找答案,但没有找到任何答案。抱歉,如果其他地方已经给出了答案。
这是我的问题:
我有一个计算成员,它是(当前成员的)项目数除以项目总数 (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]
它会起作用。
更新:几点提示:
也没有必要使用
SUM
函数,因为你可以只定义元组,这对服务器来说就足够了:([FailureReason].[FailureReason].[All],[Measures].[Count])
在
ImpactFinal
计算中检查sumitem
除以零的度量是非常合理的。因为一旦应用了一些过滤器,这可能会导致此度量归零和报告中的错误。如果您不仅有机会查询,而且有机会更新多维数据集,
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])
仅使用这两个度量而不是一组度量 sumitem
、Impact
、ImpactFinal
。第一个将显示失败结果 - 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