2013-12-17 34 views
1

時,本文給出了忽略空應用RANK當一個方法:http://www.bidn.com/blogs/CraigLove/ssas/2617/mdx-walkthrough優雅的方式來忽略空應用RANK

是否有這樣做比使用CASE的更優雅的方式?

WITH 
    MEMBER [Measures].[City Rank] 
AS 
    CASE 
     WHEN 
      NOT ISEMPTY 
      (
       (
       [Geography].[City].CurrentMember 
       ,[Measures].[Reseller Sales Amount] 
       ) 
      ) 
     THEN 
      RANK 
       (
       [Geography].[City].CurrentMember 
       ,[Geography].[City].AllMembers 
       ,[Measures].[Reseller Sales Amount] 
       ) 
     ELSE 
      NULL 
    END  


SET [OrderedCity] 
    AS 
      ORDER 
      (
      [Geography].[City].AllMembers 
      ,[Measures].[Reseller Sales Amount] 
      ,DESC 
      ) 
SELECT 
    { 
    [Measures].[City Rank] 
    ,[Measures].[Reseller Sales Amount] 
    } ON COLUMNS 
    ,NON EMPTY [OrderedCity] ON ROWS 
FROM [Adventure Works]; 

回答

1

你可以內OrderedCity應用NonEmpty功能:

WITH 

SET [OrderedCity] 
    AS 
      NonEmpty(
      ORDER 
      (
      [Geography].[City].AllMembers 
      ,[Measures].[Reseller Sales Amount] 
      ,DESC 
      ) 
      ) 
    MEMBER [Measures].[City Rank] 
AS 
      RANK 
       (
       [Geography].[City].CurrentMember 
       ,[OrderedCity] 
       ) 

SELECT 
    { 
    [Measures].[City Rank] 
    ,[Measures].[Reseller Sales Amount] 
    } ON COLUMNS 
    ,[OrderedCity] 
    ON ROWS 
FROM [Adventure Works]; 

這樣的NON EMPTY正在對在該行設定的應用之前它放在那裏,所以沒有必要在應用它行本身。此外,重新使用City Rank定義中的集合,Analysis Services只能計算一次排序,並緩存有序集合。否則,Rank將要求爲每一行重新計算排序。