2014-10-10 69 views
1

我的任務是將當前在我們的報告中使用的T-SQL代碼替換爲MDX的等效代碼。我有T-SQL經驗,但不MDX減去一組中的每個成員的計算值-MDX

我目前停留在以下問題:

  • 我們店的名單和他們的損失銷售的百分比。
  • 將每個商店的銷售損失百分比與基準數據進行比較以作進一步分析。
  • 我需要將最高四分位數的最低失銷率百分比作爲基準數字,例如,如果我們在最高四分位數中有三家商店,百分比值爲55,50,45,那麼我需要使用45作爲基線圖。
  • 的基準數字是動態的,會根據所有門店

我的問題是性能改變 - 如何減去商店的名單和他們的損失銷售的百分比基線數字?我試圖用下面的代碼來做到這一點:

WITH Member [Measures].[TopQPer] AS 
    BOTTOMCOUNT(
    TOPPERCENT(
     [Network].[Centre Id].Members, 
     25, 
     [Measures].[Lost Sales Conversion Rate SSO] 
    ), 
    1, 
    [Measures].[Lost Sales Conversion Rate SSO] 
) 
Member [Measures].[Difference] AS 
    (
    (
     [Network].[Centre Id].Members, 
     [Measures].[Lost Sales Conversion Rate SSO] 
    ) 
    - [Measures].[TopQPer] 
), FORMAT_STRING = 'Percent' 
SELECT 
    [Measures].[Difference] ON Columns, 
    [Network].[Centre Id].MEMBERS ON ROWS 

回答

1

你很近。 我會認爲

WITH Member [Measures].[TopQPer] AS 
      (Tail(TOPPERCENT([Network].[Centre Id].[Centre Id].Members, 
          25, 
          [Measures].[Lost Sales Conversion Rate SSO] 
          ) 
       ).Item(0).Item(0), 
      [Measures].[Lost Sales Conversion Rate SSO] 
      ) 
    Member [Measures].[Difference] AS 
      [Measures].[Lost Sales Conversion Rate SSO] - [Measures].[TopQPer] 
      ,FORMAT_STRING = 'Percent' 
SELECT 
      [Measures].[Difference] ON Columns, 
      [Network].[Centre Id].MEMBERS ON ROWS 
FROM  [YourCube] 

提供你想要的。

沒有必要使用Bottomcount(, 1)。使用Tail()而不是獲得最後一個條目更有效。由於TopPercent已經提供了排序的數據,我們相信我們可以採取最後一項。

我使用元組作爲[Measures].[TopQPer]的值。因此,由於Tail(如BottomCount,順便說一句)返回一個集合,我通過兩次應用Item(0)將該單元集轉換爲成員。這實際上是兩種不同的方法:第一種應用於集合,傳遞其第一個元組,第二個應用於元組,返回其第一個成員。

Difference度量的定義中,您可以從Lost Sales Conversion Rate SSO中減去新定義的度量TopQPer。後者將使用當前的[Network].[Centre Id]從每個單元格中的行標題中進行評估,而TopQPer(作爲此層次結構的當前上下文在其定義中被覆蓋)將在所有中心ID中保持不變。

最後,請注意,我使用了[Network].[Centre Id].[Centre Id].Members而不是[Network].[Centre Id].Members,因爲您使用了它。不同的是,我的版本不包括All構件,因爲它使用的Centre Id級別的成員,而你包括它,因爲它使用Centre Id層次,其中,假設這是一個標準的屬性層次結構的成員,由All級別的All成員和Centre Id級別的所有底層成員組成。我假設你不想在計算前25%的成員中包括All成員,但只包含單箇中心。如你所見,我多次提到了一些對理解MDX至關重要的概念:數據類型(成員,元組,集合,級別,層次結構)和上下文。

+0

@frankPI你只用一個參數在第一個自定義度量中使用'TAIL' - 這個函數只用一個參數做什麼? – whytheq 2014-10-11 13:39:57

+0

infact是'TopPercent'提供排序的數據爲什麼使用'TAIL' - 不是'.Item(0).Item(0)'足夠嗎? – whytheq 2014-10-11 13:41:33

+1

@whytheq正如Tail的文檔(http://msdn.microsoft.com/en-us/library/ms146056.aspx)所述,帶有一個參數的Tail等價於'Tail(,1)'。由於Item(0)返回該集合的第一個元組,而我們需要最後一個元組,所以我們不能忽略它。然而,我們可以使用'TopPercent(...)。Item(TopPercent(...)。Count - 1).Item(0)'。但是,我們會重複兩次TopPercent表達式(或者爲它引入一個命名集合)。不過,我不確定這是否會在清晰度或表現上有所提升。 – FrankPl 2014-10-13 12:22:46