2

我有一个 mdx 查询,结果返回“productCode”和“总销售额的产品份额”。我还需要按“总销售额的产品份额”(十进制)对该查询进行排序,所以我想出了以下 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
4

1 回答 1

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度量的定义使用多维数据集中定义的成员顺序(按字母顺序,如果您没有定义自定义顺序)。但是您需要 order by Contribution,因此我将其定义为包含此顺序的成员的命名集。然后我误用了Rank给你一个集合中元组位置的函数。由于第一个成员的等级是 1,我使用该Item函数在集合中获取一个元组 - 它从零开始对元组进行编号 - 我们必须返回一个成员,你需要- 2,最后,我们需要另一个Item(0)从元组中获取成员。

于 2013-09-23T16:18:30.690 回答