【问题标题】:Calculation in SSAS Cube not working for zero data valuesSSAS Cube 中的计算不适用于零数据值
【发布时间】:2014-10-20 01:48:28
【问题描述】:

我正在使用 SSAS 2008 R2 多维数据集并通过 Excel 2010 查询数据。在多维数据集中,我有一个计算来有条件地格式化数据。逻辑是,如果一个度量包含正在查看的事实的特定值,那么该事实应该被涂成红色,如下所示:

CALCULATE;     

SCOPE
(
    [Measures].[Data value]
); 

If([Fact Base].[Confidentiality Status].[Confidential]) Then
    Fore_Color(This) = 255
End If;    

END SCOPE;

当我的 [数据值] 为 0(零)时,Excel 中的 fore_color 不会呈现为红色。如果我将数据值更改为零以外的任何值,并重新处理它呈现为红色的多维数据集。是我遗漏了什么,还是有更好的MDX 脚本也适用于零值?

【问题讨论】:

  • 你确定发生错误渲染的值真的是 0 吗?还是它们可能为空(即缺失记录)?
  • @FrankPl 是的,我什至尝试将数据从 0 更改为其他值,然后重新处理多维数据集。当我这样做时,颜色按预期呈现(即红色)。当我改回 0 时,它不再存在了。
  • 我不确定这是 Excel 还是 Analysis Services 问题。您能否从 Management Studio 运行 MDX 查询,在该语句的最后附加 CELL PROPERTIES VALUE, FORMATTED_VALUE, FORE_COLOR(在所有 FROM 和 WHERE 子句之后),然后在结果中双击包含零的单元格以查看 FORE_COLOR 属性值?
  • @FrankPl 这绝对是一个在 Analysis Services 或 Excel 中可见的问题。当我单击 SSMS 中的 0 值时,返回的单元格属性显示 FORE_COLOR = (null)。这些值也显示为黑色而不是红色。我还检查了机密状态的值是“机密”,这应该导致 FORE_COLOR 为 255。
  • Data value 是计算的还是物理的?它是否可能在计算脚本的其他地方被覆盖?

标签: excel ssas mdx olap


【解决方案1】:

实际上你有以下几点:

If([Fact Base].[Confidentiality Status].[Confidential] = 1) Then
    Fore_Color(This) = 255
End If;    

(...所以不会期望0 呈现为红色?)

以下是否意味着数据0是红色的?:

If([Fact Base].[Confidentiality Status].[Confidential] = 0) Then
    Fore_Color(This) = 255
End If; 

【讨论】:

  • 不,我没有 - 我有一个表,其中包含一个名为机密状态的字段和一个名为数据值的字段。当机密状态 =“机密”时,数据值(即范围)呈现为红色。如果机密状态有任何其他值,则数据值不应为红色。出于某种原因,如果数据值为零(非空),则它不会显示为红色。
  • 为了进一步阐明机密性被暴露为退化维度,但与数据值位于同一个表中。
【解决方案2】:

你应该使用

SCOPE
(
    [Measures].[Data value], [Fact Base].[Confidentiality Status].[Confidential]
); 

    Fore_Color(This) = 255

END SCOPE;

替代方案,但效率较低:

SCOPE
(
    [Measures].[Data value]
); 

If([Fact Base].[Confidentiality Status].CurrentMember IS [Fact Base].[Confidentiality Status].[Confidential]) Then
    Fore_Color(This) = 255
End If;    

END SCOPE;

这将为度量 Data valueConfidential 成员设置前景色。

如果Confidential 成员的当前度量值(在范围内始终为Data value)不为空或不为0,则您的代码所做的是设置前景色。将数值表达式计算为一个条件,在 MDX 中,所有非 0 或空值都被评估为真。如果您在此处使用成员,MDX 会检查其当前度量的值。要检查层次结构的当前成员是否是特定成员,请使用 IS,就像我在上面的第二个版本中所做的那样。

编辑 由于要求检查当前单元格中是否包含与机密状态“机密”相关的数据,无论该维度是否包含在查询中,您都可以使用:

SCOPE
(
    [Measures].[Data value]
); 

If(Intersect(EXISTING [Fact Base].[Confidentiality Status].[Confidentiality Status].Members,
             {[Fact Base].[Confidentiality Status].[Confidential]}).Count = 1 Then
    Fore_Color(This) = 255
End If;    

END SCOPE;

这将检查与当前单元格的数据存在的Confidentiality Status 属性层次结构的Confidentiality Status 级别的所有成员与由Confidential 成员组成的一个元素集之间的交集是否有一个元素,与换句话说,如果该成员包含在该级别的现有成员中。

【讨论】:

  • 两种解决方案都有效,但它们取决于机密状态是一个活动维度 - 即,如果未使用它,则数据不会变为红色。我的问题中的初始脚本不需要在查询中选择保密状态。
  • @Greg 你到底有什么要求?
  • @FrankPI 我需要能够将数据值显示为红色,如果其机密状态为“机密”,则无论包含机密状态的维度是否实际拖入数据透视表或不是。我在问题中发布的初始代码的行为方式除了零值外。我认为您的解决方案很接近,但我怀疑我可以使用另一个值而不是“CurrentMember”。抱歉,我还是 MDX 新手。
猜你喜欢
  • 2015-03-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多