在MDX中使用订单功能时获取上一个成员

时间:2013-09-18 11:30:25

标签: ssas mdx

我有一个mdx查询,返回“productCode”和“总销售额的产品份额”。我还需要在“总销售额的产品份额”(Decs)中对该查询进行排序 所以我提出了以下MDX查询

WITH MEMBER [Measures].[Contribution] AS
     Format(
           IIF(
              IsEmpty([Measures].[Detail_Net_Sales]),
              0,
              [Measures].[Detail_Net_Sales]
              )/
           [Measures].[SumTotalPayable] 
           )
SELECT  
      {[Measures].[Contribution]} 
   ON COLUMNS,
      Order(
           [DIMProduct].[ProductCode].[ProductCode].AllMEMBERS,
           [Measures].[Contribution],
           BDESC
           ) 
   ON ROWS 
FROM [Model] }

问题在于我还希望为每个产品代码提供以前的贡献 我写下了这样的事情:

WITH MEMBER [Measures].[Contribution] AS
Format(iif(IsEmpty([Measures].[Detail_Net_Sales]),0,[Measures]     [Detail_Net_Sales])/[Measures].[SumTotalPayable] )
MEMBER [Measures].[test]
AS

([Measures].[Contribution], [DIMProduct].[ProductCode].CurrentMember.PrevMember)

SELECT  { [Measures].[Contribution] ,[Measures].[test]} ON COLUMNS
, Order([DIMProduct].[ProductCode].[ProductCode].AllMEMBERS ,[Measures].    [Contribution],BDESC)ON ROWS 
FROM [Model] 

但上面的代码将返回之前的贡献而没有欲望订单。 你有什么想法我能解决这个问题吗?

修改: 我希望前一行的贡献基于我的排序,并且还具有基于我之前排序的测试度量,如下表所示:

ProductCode Contribution Test                       
----------- ------------ ----                                            
123          17.56       null
332          17.30       17.56
245          16          17.30
656          15.90       16

但我得到的是这样的:

ProductCode Contribution Test                       
----------- ------------ ----                                            
123          17.56       17.30
332          17.30       16
245          16          Null
656          15.90       17.30

1 个答案:

答案 0 :(得分:1)

WITH MEMBER [Measures].[Contribution] AS
     Format(
           IIF(
              IsEmpty([Measures].[Detail_Net_Sales]),
              0,
              [Measures].[Detail_Net_Sales]
              )/
           [Measures].[SumTotalPayable] 
           )
     SET SortedProducts AS
     Order(
           [DIMProduct].[ProductCode].[ProductCode].AllMEMBERS,
           [Measures].[Contribution],
           BDESC
           ) 
     MEMBER [Measures].[PrevContribution] AS
     (SortedProducts.Item(
           Rank([DIMProduct].[ProductCode].CurrentMember, SortedProducts) - 2)
           .Item(0), 
     [Measures].[Contribution]) 
SELECT  
      {[Measures].[Contribution], [Measures].[PrevContribution]} 
   ON COLUMNS,
      SortedProducts
   ON ROWS 
FROM [Model] }

您对test度量的定义使用多维数据集中定义的成员顺序(如果您没有定义自定义顺序,则按字母顺序排列)。但是您需要Contribution的顺序,因此我将其定义为包含此顺序成员的命名集。然后我误用了Rank函数,它给出了集合中元组的位置。由于第一个成员的等级是1,我使用Item函数来获取集合中的元组 - 它开始将元组编号为零 - 我们必须返回一个成员,你需要{ {1}},最后,我们需要另一个- 2来从元组中获取成员。