Ssas 使用MDX划分并列列

Ssas 使用MDX划分并列列,ssas,mdx,Ssas,Mdx,仍然需要解释MSDN上的MDX文档。因此,它具有以下特点: 如果指定了数值表达式,则秩函数将确定 通过计算指定的 针对元组的数值表达式。如果数值表达式是 指定时,Rank函数将相同的秩分配给具有 重复集合中的值。将同一级别的任务分配给 重复值会影响集合中后续元组的秩。 例如,一个集合由以下元组组成,{(a,b),(e,f), (c,d)}。元组(a,b)的值与元组(c,d)的值相同。如果 元组(a,b)的秩为1,那么(a,b)和(c,d)都有一个 排名1。然而,元组(e,f)的秩为3。那里 此集

仍然需要解释
MSDN
上的
MDX
文档。因此,它具有以下特点:

如果指定了数值表达式,则秩函数将确定 通过计算指定的 针对元组的数值表达式。如果数值表达式是 指定时,Rank函数将相同的秩分配给具有 重复集合中的值。将同一级别的任务分配给 重复值会影响集合中后续元组的秩。 例如,一个集合由以下元组组成,{(a,b),(e,f), (c,d)}。元组(a,b)的值与元组(c,d)的值相同。如果 元组(a,b)的秩为1,那么(a,b)和(c,d)都有一个 排名1。然而,元组(e,f)的秩为3。那里 此集中不能有秩为2的元组。如果是数字 表达式,则Rank函数返回基于 指定元组的序号位置。秩函数不存在 订这套

在下面的脚本中,如果两个人的最高工资并列第二,我将获得以下工资等级:

1
2
2
四,

我想做的是用服役年限来决定哪一个级别更高。这可能吗

WITH 
    SET [OrderedPeople] AS 
        ORDER(
            NONEMPTY(
                [PeopleDimension].[PeopleHier].[NamesLevel].members,
                { //following means if one or the other is null 
                  //then the row is not excluded
                [Measures].[Salary],
                [Measures].[NumYearsService]
                }
            ),
            [Measures].[Salary]
            *
            [Measures].[NumYearsService]
            , 
            BDESC
            )
    MEMBER [Measures].[Salary_Rank] AS 
        RANK([PeopleDimension].[PeopleHier].CurrentMember,
            [OrderedPeople],
            [Measures].[Salary] //<<<how do I use numYearsService to decide ties?
            )
SELECT 
    NON EMPTY 
        { 
        [Measures].[NumYearsService],       
        [Measures].[Salary],
        [Measures].[Salary_Rank]             
        }
    ON COLUMNS,

    NON EMPTY 
        [OrderedPeople]
    ON ROWS  

FROM [ourCube]
WHERE   
    (
    {TAIL([Date].[Date - Calendar Month].[Calendar Day],7)(0):
    TAIL([Date].[Date - Calendar Month].[Calendar Day],7)(6)}
    )
与
将[OrderedPeople]设置为
命令(
非空(
[PeopleDimension].[PeopleHier].[NamesLevel]。成员,
{//如果一个或另一个为空,则表示以下内容
//那么就不排除该行
[措施][工资],
[措施].[Numyearservice]
}
),
[措施][薪金]
*
[措施].[Numyearservice]
, 
BDESC
)
成员[测量][薪资等级]为
排名([PeopleDimension][PeopleHier].CurrentMember,
[OrderedPeople],

[Measures].[Salary]/如果已经对集合进行了排序,则使用
Rank
而不使用第三个参数,即

RANK([PeopleDimension].[PeopleHier].CurrentMember,
     [OrderedPeople]
)
Rank
返回第一个参数在集合中的位置,该集合是第二个参数。第三个参数专门用于希望领带具有相同值的情况。如果使用第三个参数,则对于集合中的相邻元素,将选中第三个参数,返回值为p集合中第一个元素的位置,该元素对于第三个参数具有相同的值

要在MDX中按多个条件订购,请在彼此之间嵌套两个订单:

ORDER(
   ORDER(
        NONEMPTY(
            [PeopleDimension].[PeopleHier].[NamesLevel].members,
            { //following means if one or the other is null 
              //then the row is not excluded
            [Measures].[Salary],
            [Measures].[NumYearsService]
            }
        ),
        [Measures].[NumYearsService]
        , 
        BDESC
    ),
    [Measures].[Salary],
    BDESC
)

由于MDX
Order
保证执行外部排序,因此,当执行外部排序时,具有相同薪水的成员不会改变第一次排序的相对顺序,这意味着他们将继续按服务年限进行排序。

+1谢谢-尽管我在
Order
集合中包含了这两个度量,我希望
[Salary_Rank]
首先基于薪水,然后基于
NumYearsService
。我在
[OrderedPeople]
中使用了两者的交叉,以避免失去多维数据集中任何有NumYearsService值但没有薪水的人(这不是最好的示例,但这是我拥有的实际多维数据集和度量值的一种可能性)也许我应该更改顺序集-实际上,我试图用该集合实现的是所有具有薪水或numyearsservice或两者兼有的名称(集合中没有重复项)@为什么我在我的回答中添加了一些关于
order
的建议。谢谢弗兰克-我是否应该使用
order
?我所需要的只是一个集合,其中包含
[PeopleDimension].[PeopleHier].[NamesLevel]的所有成员.具有非空工资的成员,以及具有非空NumYearsService的所有成员。如果要使用
Rank
,则必须对要对其进行排序的集合进行排序,因为
Rank
只返回成员在集合中的位置,而不会对集合本身进行排序。