通过过滤度量值在 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 中定义计算成员的主要内容,如果未能解决你的问题,请参考以下文章