2015-11-05 27 views
1

我使用了以下内容:帐户捆绑行列

WITH 
    SET [myset] AS 
    Order 
    (
     { 
      [Customer].[Country].[Country].MEMBERS 
     * 
      [Customer].[Customer].[Customer].MEMBERS 
     } 
    ,[Measures].[Internet Sales Amount] 
    ,ASC 
    ) 
    MEMBER [Measures].[rank] AS 
    Rank 
    (
     (
     [Customer].[Country].CurrentMember 
     ,[Customer].[Customer].CurrentMember 
    ) 
    ,[myset] 
    ) 
    MEMBER [Measures].[newrank] AS 
    IIF 
    (
     [myset].Item(
     [Measures].[rank] - 1).Item(0).Name 
     <> 
     [myset].Item(
     [Measures].[rank] - 2).Item(0).Name 
    ,1 
    , 
     ([myset].Item([Measures].[rank] - 2),[Measures].[newrank]) + 1 
    ) 
SELECT 
    { 
    [Measures].[Internet Sales Amount] 
    ,[Measures].[rank] 
    ,[Measures].[newrank] 
    } ON 0 
,[myset] ON 1 
FROM [Adventure Works]; 

这是阿米什沙阿的工作:它不给具有相同价值同级别例如元组http://blog.sqltechie.com/2010/03/rank-with-partitioning-mdx.html

目前如果x的互联网销售额为10,y也有10,则上面他们的排名不会相同。

以上可以更改,如果它们具有相同的值,那么它们具有相同的值[Measures].[rank] - 也是相同的值为[Measures].[newrank]

(添加第三参数转换的[Measures].[rank]定义似乎并不像一个可能的路线进行作为Rank函数然后进入CEL-受到小区计算模式)

+1

Upvoted为其提供的纯粹挑战 – SouravA

回答

0

如何使用递归计算成员等所以 -

WITH 
    SET [myset] AS 
    Order 
    (
     { 
      [Customer].[Country].[Country].MEMBERS 
     * 
      [Customer].[Customer].[Customer].MEMBERS 
     } 
    ,[Measures].[Internet Sales Amount] 
    ,ASC 
    ) 
    MEMBER [Measures].[myrank] AS 
    Rank 
    (
     (
     [Customer].[Country].CurrentMember 
     ,[Customer].[Customer].CurrentMember 
    ) 
    ,[myset] 
    ) 


member prevmembervalue as 
(myset.item(myRank - 2), [Measures].[Internet Sales Amount]) 

member currentmembervalue as 
(myset.item(myRank - 1), [Measures].[Internet Sales Amount]) 

MEMBER greaterthanprev as 
iif(currentmembervalue > prevmembervalue, 1, 0) 

member rankActual as 
iif 
(
prevmembervalue = null, 1, 
iif(currentmembervalue > prevmembervalue, 
    (myset.item(myRank - 2), rankActual) + 1, 
    (myset.item(myRank - 2), rankActual) 
) 
) 

select myset on 1, 
{[Measures].[Internet Sales Amount], rankActual, myRank} 
on 0 
from 
[Adventure Works] 

实际上并不需要greaterthanprevcurrentmembervalueprevmembervalue措施。在这里添加它们只是为了进一步澄清过程。

+0

我认为这与我最终使用的脚本非常相似,但如果说列表中第二个国家/地区的客户的每个值都小于每个值,那么您可能会有点不对对于第一个国家的所有客户? – whytheq

+0

请赐教。我不能想到它会出错。 – SouravA

+0

您放弃了'.Name'的比较,这是确保排名被分区的逻辑。 – whytheq