如何编写MDX查询以返回ID和名称为的成员?

如何编写MDX查询以返回ID和名称为的成员?,mdx,mondrian,Mdx,Mondrian,我正在尝试编写一个MDX查询,该查询返回一个结果,其中包括成员列表、成员Id和度量值。在本例中,我有一个事实表,用于对调查中的值进行评级。每个评级值都有一个问题维度的外键,该维度包含Id和Name列。我想要的信息是每个问题的Id和名称以及总平均评分。到目前为止,我可以获得Id和评级,或者姓名和评级,但我不知道如何获得两者 以下是我尝试过的查询: SELECT NON EMPTY {[Measures].[Rating]} ON COLUMNS, NON EMPTY {[Question].[Qu

我正在尝试编写一个MDX查询,该查询返回一个结果,其中包括成员列表、成员Id和度量值。在本例中,我有一个事实表,用于对调查中的值进行评级。每个评级值都有一个问题维度的外键,该维度包含Id和Name列。我想要的信息是每个问题的Id和名称以及总平均评分。到目前为止,我可以获得Id和评级,或者姓名和评级,但我不知道如何获得两者

以下是我尝试过的查询:

SELECT
NON EMPTY {[Measures].[Rating]} ON COLUMNS,
NON EMPTY {[Question].[Question Id].Members, 
           [Question].[Question Caption].Members} ON ROWS
FROM [Ratings]
它几乎可以工作,除了我得到重复的值,下面是一个示例结果:

[Question].[10]                             3.5
[Question].[11]                             4.2
[Question].[12]                             4.9
[Question].[13]                             4.0
[Question].[10].[blar abc]                  3.5
[Question].[11].[blar def]                  4.2
[Question].[12].[blarrr]                    4.9
[Question].[13].[something else]            4.2
你可以看到问题10出现了两次,评分为3.5分,一次没有名字,一次有名字


我想用MDX做的事情可能吗?我错过了什么?这是由Mondrian执行的。

这取决于问题维度的层次结构是如何设置的。在这里,我假设层次结构是

All Questions
    > Id 
        > Name
(这可能不是建立层次结构的最佳方式,因为标题只是给定问题成员的属性,不是级别,但我离题了)

您所做的错误在于,您正在创建一个集合,其中包含来自两个级别(Id和标题)的所有成员。通常,较高级别的成员(例如[Question][13])会汇总度量值,但由于每个Id只有一个标题,因此两个级别的平均评分相同

一种解决方案是不使用Id级别,而是从标题成员的UniqueName中提取Id

SELECT
NON EMPTY {[Measures].[Rating]} ON COLUMNS,
NON EMPTY {[Question].[Question Caption].Members} ON ROWS
FROM [Ratings]
如果确实希望将Id作为结果中的单元格,也可以使用计算成员来保存该值:

WITH MEMBER [Measures].[QuestionId] AS Iif(
        Not IsEmpty([Measures].[Rating]), 
        [Question].CurrentMember.Parent.Name, 
        NULL
    )
SELECT
NON EMPTY {[Measures].[QuestionId], [Measures].[Rating]} ON COLUMNS,
NON EMPTY {[Question].[Question Caption].Members} ON ROWS
FROM [Ratings]
Iif函数确保在没有评分时有一个空成员,否则不管怎样,每个问题都会有一行


编辑: 您可以使用一个级别层次结构,即
All Questions>Question
(如果您有任何其他分析有用的问题分类,您可以在这两者之间添加其他级别)

问题级别代表一个问题实例,因此您可以做很多事情:

  • 将此级别的“唯一标识符”(成员键,由架构中的
    值给出)作为问题ID
  • 将“用户标识符”(由模式中的
    name列
    值给出)作为问题标题
  • 您可以将层次结构中没有意义的其他有用属性添加到此级别(通过架构中的属性标记) 然后,您可以按标题选择问题,如
    [question]。[此处的标题]
    ,您可以按Id选择问题,如
    [question]。&[Id here]
    。如果要检索属性,可以按如下方式执行:

    SELECT
    NON EMPTY {[Measures].[Rating]} ON COLUMNS,
    NON EMPTY {[Question].[Question].Members} 
        DIMENSION PROPERTIES [Question].Key, [Question].[other property name] ON ROWS
    FROM [Ratings]
    

    属性作为元数据添加到结果单元格集中。

    这取决于问题维度的层次结构的设置方式。在这里,我假设层次结构是

    All Questions
        > Id 
            > Name
    
    (这可能不是建立层次结构的最佳方式,因为标题只是给定问题成员的属性,不是级别,但我离题了)

    您所做的错误在于,您正在创建一个集合,其中包含来自两个级别(Id和标题)的所有成员。通常,较高级别的成员(例如[Question][13])会汇总度量值,但由于每个Id只有一个标题,因此两个级别的平均评分相同

    一种解决方案是不使用Id级别,而是从标题成员的UniqueName中提取Id

    SELECT
    NON EMPTY {[Measures].[Rating]} ON COLUMNS,
    NON EMPTY {[Question].[Question Caption].Members} ON ROWS
    FROM [Ratings]
    
    如果确实希望将Id作为结果中的单元格,也可以使用计算成员来保存该值:

    WITH MEMBER [Measures].[QuestionId] AS Iif(
            Not IsEmpty([Measures].[Rating]), 
            [Question].CurrentMember.Parent.Name, 
            NULL
        )
    SELECT
    NON EMPTY {[Measures].[QuestionId], [Measures].[Rating]} ON COLUMNS,
    NON EMPTY {[Question].[Question Caption].Members} ON ROWS
    FROM [Ratings]
    
    Iif函数确保在没有评分时有一个空成员,否则不管怎样,每个问题都会有一行


    编辑: 您可以使用一个级别层次结构,即
    All Questions>Question
    (如果您有任何其他分析有用的问题分类,您可以在这两者之间添加其他级别)

    问题级别代表一个问题实例,因此您可以做很多事情:

  • 将此级别的“唯一标识符”(成员键,由架构中的
    值给出)作为问题ID
  • 将“用户标识符”(由模式中的
    name列
    值给出)作为问题标题
  • 您可以将层次结构中没有意义的其他有用属性添加到此级别(通过架构中的属性标记) 然后,您可以按标题选择问题,如
    [question]。[此处的标题]
    ,您可以按Id选择问题,如
    [question]。&[Id here]
    。如果要检索属性,可以按如下方式执行:

    SELECT
    NON EMPTY {[Measures].[Rating]} ON COLUMNS,
    NON EMPTY {[Question].[Question].Members} 
        DIMENSION PROPERTIES [Question].Key, [Question].[other property name] ON ROWS
    FROM [Ratings]
    

    属性作为元数据添加到生成的单元集中。

    非常感谢!第一个SELECT有效,我没有意识到我正在将ID作为完整成员名的一部分取回。您提到标题可能只是一个属性。如果这更有意义的话,我可以更新我的模式,但我不确定如何在查询中使用它来获取所需的信息。您是否有机会分享一些关于如何更好地建模和选择数据的信息?非常感谢,这非常有帮助!我现在有大约10天的MDX经验,所以这是非常好的信息,正如你所描述的那样有效。非常感谢!第一个SELECT有效,我没有意识到我正在将ID作为完整成员名的一部分取回。您提到标题可能只是一个属性。如果这更有意义的话,我可以更新我的模式,但我不确定如何在查询中使用它来获取所需的信息。您是否有机会分享一些关于如何更好地建模和选择数据的信息?非常感谢,这非常有帮助!我现在有大约10天的MDX经验,所以这是非常好的信息,正如您所描述的那样有效。