2

結果として「productCode」と「総売上の製品シェア」を返すmdxクエリがあります。また、そのクエリを「総売上の製品シェア」(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
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関数を使用してセット内のタプルを取得します (タプルの番号は 0 から始まります)。メンバーを 1 つ戻す必要があるため、 が必要であり- 2、最後に が必要です。Item(0)タプルからメンバーを取得する別のもの。

于 2013-09-23T16:18:30.690 に答える