代码之家  ›  专栏  ›  技术社区  ›  Nickolay

在MDX中定义计算成员-筛选度量值

  •  2
  • Nickolay  · 技术社区  · 16 年前

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

    新度量值的值应该通过应用额外的筛选条件从现有度量值计算出来。我想用一个例子会更清楚一些:

    • 现有措施:“总交通量”
    • 现有尺寸:“方向”(“入”或“出”)。
    • 我需要创建一个计算成员“incoming traffic”,它等于“total traffic”,带有一个附加的过滤器(direction=“in”)。

    问题是我不知道MDX,而且我的日程安排很紧(对于新手的问题很抱歉)。我能想到的最好办法是:

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

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

    example

    所以看起来方向上的“固有”过滤器被我自己的过滤器覆盖了)。我需要一个“内在”过滤器和我自己的过滤器的交集。我的直觉是这和交叉有关 [Direction].[(All)].[In] 在评估细胞的内在坐标时,很难知道我需要什么,而不首先阅读主题:)

    [编辑]我以

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

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

    3 回复  |  直到 9 年前
        1
  •  8
  •   Magnus Smith    16 年前

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

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

    每当您在报表上显示新度量值时,无论是否使用方向维度,该度量值的行为都将类似于其上具有“direction>in”筛选器。

    但在你的例子中,你希望方向维度在使用时具有超前性……所以事情会变得有点混乱。您必须检测此维度是否在使用中,并相应地执行以下操作:

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

    为了查看维度是否在使用中,我们检查当前单元格是否正在使用out。如果是这样的话,我们就可以按原样返回总流量。如果不是,我们可以告诉它在元组中使用。

        2
  •  1
  •   Ben    11 年前

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

        3
  •  1
  •   Community Egal    7 年前

    也可以看看 this question ,它描述了相同的问题,并在那里发布了不同的答案。