通过过滤度量值在 MDX 中定义计算成员

Posted

技术标签:

【中文标题】通过过滤度量值在 MDX 中定义计算成员【英文标题】:Define a calculated member in MDX by filtering a measure's value 【发布时间】:2008-10-13 12:30:32 【问题描述】:

我需要在 MDX 中定义一个计算成员(这是 SAS OLAP,但我很感谢那些使用不同 OLAP 实现的人的回答)。

新度量的值应通过应用附加过滤条件从现有度量计算。我想举个例子会更清楚:

现有度量:“总流量” 现有维度:“方向”(“In”或“Out”) 我需要创建一个计算成员“传入流量”,它等于带有附加过滤器的“总流量”(Direction = “In”)

问题是我不了解 MDX,而且我的日程安排非常紧张(对于新手问题,我深表歉意)。我能想到的最好的方法是:

([Measures].[Total traffic], [Direction].[(All)].[In])

这几乎可以工作,除了具有特定方向的单元格:

所以看起来方向上的“内在”过滤器被我自己的过滤器覆盖)。我需要“内在”过滤器和我自己的过滤器的交集。我的直觉是它与相交[Direction].[(All)].[In] 与被评估单元格的内在坐标有关,但如果不先阅读该主题,很难知道我需要什么:)

[更新]我最终得到了

IIF([Direction].currentMember = [Direction].[(All)].[Out],
    0,
    ([Measures].[Total traffic], [Direction].[(All)].[In])
)

..但至少在 SAS OLAP 中,这会导致对基础数据集执行额外的查询(以计算 [in] 的值),所以我最终没有使用它。

【问题讨论】:

【参考方案1】:

首先,您可以在 MDX 中定义一个新的计算度量,并告诉它使用另一个度量的值,但应用了过滤器:

WITH MEMBER [Measures].[Incoming Traffic] AS
'([Measures].[Total traffic], [Direction].[(All)].[In])'

每当您在报表上显示新度量时,无论是否使用“方向”维度,它都会表现得好像它有一个“方向 > In”过滤器。

但在您的情况下,您希望在使用时优先使用方向维度......所以事情变得有点混乱。您必须检测此维度是否正在使用,并采取相应措施:

WITH MEMBER [Measures].[Incoming Traffic] AS
'IIF([Direction].currentMember = [Direction].[(All)].[Out],
    ([Measures].[Total traffic]),
    ([Measures].[Total traffic], [Directon].[(All)].[In])
)'

要查看 Dimension 是否正在使用,我们检查当前单元格是否正在使用 OUT。如果是这样,我们可以按原样返回总流量。如果没有,我们可以告诉它在我们的元组中使用 IN。

【讨论】:

除了传入流量[out] = 0,因此我使用了“0”而不是“([Measures].[Total traffic])”。非常感谢! 请注意MS docs on Equals 说:要比较对象,请使用IS (MDX) 运算符。例如,在检查查询轴上的当前成员是否为特定成员时使用 IS 运算符。【参考方案2】:

我认为您应该在总流量事实表中放置一列用于 IN/OUT 指示,并为 IN 和 Out 值创建一个 Dim 表。然后,您可以根据 IN & Out 分析您的数据。

【讨论】:

以上是关于通过过滤度量值在 MDX 中定义计算成员的主要内容,如果未能解决你的问题,请参考以下文章

维度成员作为 MDX 中的计算度量

MDX IIF 语句根据度量和层次结构叶计算新成员

如何在 MDX 中基于维度属性定义计算度量?

在 MDX 中使用“不同定义”计算相同度量的差异

OLAP SSAS MDX 如何获取先前选定/可见日期的度量值

使用 where 子句 (MDX) 的 SSAS 计算度量