【问题标题】:Search AllMembers of User Hierarchy - for corresponding Set return a related members from upper and lower levelsSearch AllMembers of User Hierarchy - 对应的 Set 返回上层和下层的相关成员
【发布时间】:2014-01-10 12:37:33
【问题描述】:

我们有一个user hierarchy 有 3 个级别(Level1 是上层 - Level3 是下层)

使用FILTER 函数我声明一个字符串,该字符串可以在任何(或多个)级别的任何成员的member_name 内。这会返回一个集合。

然后,我希望层次结构中与集合中的每个项目相关的所有成员;上下两层。

我还尝试(未成功)在结果中包含一个始终为 Level2 的列作为参考以及一个排序列。

WITH 
    MEMBER [Measures].[LevelName] AS
        [DimensionX].[HierX].Level.Name
    MEMBER [Measures].[LevelNumber] AS
        [DimensionX].[HierX].Level.Ordinal
    MEMBER [Measures].[MemName] AS //<<<<<not working as I want level 2 in the result set
        [DimensionX].[HierX].currentmember.membervalue
    SET [Set_Target] AS
        {
        FILTER(
            [DimensionX].[HierX].AllMembers,
                (
                InStr(
                    1, 
                    [DimensionX].[HierX].currentmember.name, 
                    "jesus") <> 0
                ) 
            )
        }
SELECT
//   ORDER(
//      Exists(
//      [AttributeHierX].members, 
//      [Set_Target]
//      ),
//    [AttributeHierX].[AttributeHierX].MEMBERVALUE
//      )
//*
    ORDER(
        DESCENDANTS(
            [Set_Target],
            [DimensionX].[HierX].[Level1],
            SELF_BEFORE_AFTER
            ),
        [Measures].[LevelNumber],
        BASC
    ) as X
    ON 1,
    {
    [Measures].[MemName], 
    [Measures].[LevelName],
    [Measures].[LevelNumber] 
    } ON 0
FROM [CubeX] 

【问题讨论】:

    标签: ssas mdx


    【解决方案1】:

    我想 AdventureWorks 上的类似查询可以满足您的需求:

    WITH 
       MEMBER [Measures].[LevelName] AS
           [Employee].[Employee Department].CurrentMember.Level.Name
       MEMBER [Measures].[LevelNumber] AS
           [Employee].[Employee Department].CurrentMember.Level.Ordinal
       MEMBER [Measures].[MemName] AS
           [Employee].[Employee Department].CurrentMember.Name
       SET [Set_TargetEmp] AS
            {
            FILTER(
                [Employee Department].AllMembers,
                    (
                    InStr(
                        1, 
                        [Employee].[Employee Department].currentmember.name, 
                        "WC4") <> 0
                    ) 
                )
            }
    SELECT
        {
        [Measures].[MemName], 
        [Measures].[LevelName],
        [Measures].[LevelNumber] 
        } ON 0,
        Hierarchize(
            Generate([Set_TargetEmp] as e,
                Ascendants(e.Current)
                +
                Descendants(e.Current, e.Current.Level, SELF_AND_AFTER)
            )
        )
        ON 1
    FROM [Adventure Works] 
    

    我使用Hierarchize 按层次结构对结果进行排序,因为这似乎是我检查结果的最简单方法。你可能想改变它。因为 - 与 Descendants 方法相反 - Ascendants 不允许将集合作为第一个参数,所以我使用 Generate 沿着集合进行迭代。它的默认行为(没有All 的第三个参数),它消除了重复,我认为这是您需要的行为。

    【讨论】:

    • +1 消除欺骗是我所希望的,但昨晚我记得我忘了提到,然后在 MDX Cookbook 中注意到有一个 DISTINCT 函数,但如果不需要,那就更好了。
    • (以为你说你没有使用 DESCENDANTS !! ...这是对函数的崇高使用:Descendants(e.Current, e.Current.Level, SELF_AND_AFTER)
    • @FrankPI - Hierarchize+ 正在删除重复项吗?
    • @whytheq 消除重复的是带有两个参数的Generate,与带有All 作为第三个参数的Generate(x, x, ALL) 形成对比,这将保留重复。
    猜你喜欢
    • 1970-01-01
    • 2015-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多