【问题标题】:Aggregating value over multi-level hierarchy while exculding members在排除成员的同时在多级层次结构中聚合价值
【发布时间】:2013-06-17 10:51:59
【问题描述】:

我有一个多维数据集,其中包含多级管理器层次结构以及在时间维度上已完成的工作单元。让我们假设这是我正在使用的数据:

http://i.stack.imgur.com/eNP4L.png

我试图通过 MDX 做的是专注于特定级别(级别 1,John Smith)并从层次结构中删除个人(最终用户和经理)并正确汇总值。

http://i.stack.imgur.com/xW5CF.png

从上图可以看出,我们已经移除了 Lisa Rice 和 Morgan Richardson 的整个团队。预期结果将是两列,全名和工作单位。

到目前为止,我汇总的查询如下所示:

WITH SET [MyCustomSet] AS EXCEPT(
    DESCENDANTS([HR].[Mgr Hierarchy].&[JSMITH],, SELF_AND_AFTER), 
    {DESCENDANTS([HR].[Mgr Hierarchy].&[MRICHARDSON],,SELF_AND_AFTER), DESCENDANTS([HR].[Mgr Hierarchy].&[LRICE],,SELF_AND_AFTER)}
)
MEMBER [Measures].[MyMeasure] AS Aggregate([MyCustomSet], [Measures].[#Work Units])
SELECT {
    [Measures].[MyMeasure]
} ON COLUMNS, 
NON EMPTY {
    [MyCustomSet]
} ON ROWS
FROM [MyCube]

但这会返回我需要的成员列表,但每个成员的聚合值是所有成员的总数。当我删除计算的度量并仅使用 [Measures].[#Work Units] 时,这些值表示未删除成员的总汇总值,但成员不存在于列中。

此数据的最终归宿将位于具有递归父关系的 SSRS 表设置中,以正确显示层次结构。

任何人都可以伸出援助之手或指出正确的方向吗?谢谢!

【问题讨论】:

  • 我自己解决了

标签: ssas mdx hierarchy


【解决方案1】:

我认为您想将Aggregate() 更改为每个成员下方的聚合,而不是整个[MyCustomSet]。比如:

MEMBER [Measures].[MyMeasure] AS 
    Aggregate([HR].[Mgr Hierarchy].CurrentMember, [Measures].[#Work Units])

编辑:如果您正在寻找在每个父级别更改的聚合,也许您应该考虑使用子选择。

SELECT 
    [Measures].[#Work Units] ON COLUMNS, 
    NON EMPTY [HR].[Mgr Hierarchy].Members ON ROWS
FROM (
    SELECT EXCEPT(
        DESCENDANTS([HR].[Mgr Hierarchy].&[JSMITH],, SELF_AND_AFTER), 
        {DESCENDANTS([HR].[Mgr Hierarchy].&[MRICHARDSON],,SELF_AND_AFTER), DESCENDANTS([HR].[Mgr Hierarchy].&[LRICE],,SELF_AND_AFTER)}
        ON COLUMNS
    FROM [MyCube]
)

【讨论】:

  • 更改此项会聚合仍包含我要排除的成员的集合的工作项总数。这就是为什么自定义集必须包含在此计算中的原因。
  • 啊,对不起,我误解了你的问题。因此,您想要一个自定义集,并且您希望每个级别的总数与您保留或从自定义集中删除的成员一致?您是否尝试过子选择?
  • 啊,我完全忘记了子查询(对 MDX 来说还是相当新的)。所以我修改了查询,并确认子查询返回了正确的成员,但在整个查询中,排除的成员仍然包括在内。有什么想法吗?感谢您的帮助!
  • 这可能取决于您的层次结构,以及您选择或排除的确切内容。请记住,子选择/子多维数据集将包括您选择的任何成员的所有祖先和后代——您是在告诉多维数据集要保留层次结构的哪些分支,而不是给出单个成员的简单列表。因此,如果您的子选择在层次结构顶部/附近包含一个成员,您仍然会得到它的所有子项;如果您的子选择只指定了一些孩子,您将让他们的父母/后代回到层次结构的根,而不是他们的“叔叔”。
  • 感谢 finango,这是我在子查询方面没有掌握的概念,在这种情况下,MDX 不允许挑选特定成员,这真是令人遗憾。
【解决方案2】:

我会选择sub-query;这样,您将能够仅选择您想要保留的 [HR] 成员,并使用 VISUAL(默认行为)与 NON VISUAL 模式,您将获得实际选定成员或所有成员的聚合值维度:

WITH SET [MyCustomSet] AS EXCEPT(
    DESCENDANTS([HR].[Mgr Hierarchy].&[JSMITH],, SELF_AND_AFTER), 
    {DESCENDANTS([HR].[Mgr Hierarchy].&[MRICHARDSON],,SELF_AND_AFTER), DESCENDANTS([HR].[Mgr Hierarchy].&[LRICE],,SELF_AND_AFTER)}
)

SELECT
    [Measures].[#Work Units] ON 0, NON EMPTY [MyCustomSet] ON 1
FROM ( select [MyCustomSet] on 0 from [MyCube] )

【讨论】:

  • 感谢您的建议,看起来子查询可能是路径(正如 findango 也建议的那样),但 except 语句似乎没有过滤掉我需要排除的成员。此外,在尝试了您的查询版本后,您似乎无法在子查询中使用在外部查询中命名的集合。再次感谢您的意见。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-10-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多