2015-05-05 40 views
1

我想創建一個MDX查詢計算出最暢銷的店的領地,然後小計領土。MDX頂部開始往下數小計

我已經使用TOPCOUNT函數生成函數創建的最常見地點一集,但我有試圖子總每一領土真正的麻煩。

我MDX如下:

WITH SET [TopLocationsPerTerritory] AS 
    GENERATE( 
     Except ([Locations].[Territory].MEMBERS, [Locations].[Territory].[All]), 

     TOPCOUNT(
      {[Locations].[Territory].CurrentMember} * Except ([Locations].[Location Hierarchy].[Location].MEMBERS,[Locations].[Location Hierarchy].[Location].[All]), 
      5, 
      [Measures].[SLS ($)] 
     ) 
    ) 
SELECT { 
      [Measures].[SLS YTD ($)], 
      [Measures].[SbD BUD SLS YTD ($)], 
      [Measures].[SbD BUD v ACT SLS YTD VAR %], 
      [Measures].[SLS LFL YTD %], 

      [Measures].[SLS GP YTD ($)], 
      [Measures].[SbD BUD GP YTD ($)], 
      [Measures].[SbD BUD v ACT GP YTD VAR %], 
      [Measures].[SLS LFL GP YTD %], 

      [Measures].[SLS ($)], 
      [Measures].[SbD BUD GP ($)], 
      [Measures].[SbD BUD v ACT SLS VAR %], 
      [Measures].[SLS LFL %], 

      [Measures].[SLS GP ($)], 
      [Measures].[SbD BUD GP ($)], 
      [Measures].[SbD BUD v ACT GP VAR %], 
      [Measures].[SLS LFL GP %] 

     } ON COLUMNS, 
     (
      [TopLocationsPerTerritory] 
     ) on ROWS 

而且效果都不錯。 enter image description here 但是我已經嘗試了幾種方法,無法獲得每個領土的小計。我設法得到了整個數據集的集合,但這不是我所需要的。

+0

人們很難幫助你。也許你可以用樣本數據和期望的結果創建一個更簡單的數據集版本。 – Stephan

+0

@Stephan - 好像包含所有必需的信息 – whytheq

+0

嗨Will--你找到了你的問題的答案嗎? – whytheq

回答

1

嘗試unionAll成員:

WITH 
    SET [TopLocationsPerTerritory] AS 
    Generate 
    (
     Except 
     (
     [Locations].[Territory].MEMBERS 
     ,[Locations].[Territory].[All] 
    ) 
    ,Union 
     (
     TopCount 
     (
      {[Locations].[Territory].CurrentMember} 
      * 
      Except 
      (
       [Locations].[Location Hierarchy].[Location].MEMBERS 
      ,[Locations].[Location Hierarchy].[Location].[All] 
      ) 
     ,5 
     ,[Measures].[SLS ($)] 
     ) 
     ,(
      [Locations].[Territory].CurrentMember 
     ,[Locations].[Location Hierarchy].[Location].[All] 
     ) 
    ) 
    ) 
... 
... 
... 

原型在AdvWrks上面似乎很好地工作:

WITH 
    SET [Top5StatesPerCountry] AS 
    Generate 
    (
     [Country].[Country].MEMBERS 
    ,Union 
     (
     TopCount 
     (
      [Country].CurrentMember * [State-Province].[State-Province].MEMBERS 
     ,5 
     ,[Measures].[Internet Order Count] 
     ) 
     ,(
      [Country].CurrentMember 
     ,[State-Province].[All] 
     ) 
    ) 
    ) 
SELECT 
    {[Measures].[Internet Order Count]} ON COLUMNS 
,{[Top5StatesPerCountry]} ON ROWS 
FROM [Adventure Works]; 

下面是結果的一個片段:

enter image description here

但下面是簡單得多的解決方案,不與uniongenerate打擾:

WITH 
    SET [Top5StatesPerCountry] AS 
    Generate 
    (
     [Country].[Country].MEMBERS 
    ,TopCount 
     (
     (EXISTING 
      [State-Province].[State-Province].MEMBERS) 
     ,5 
     ,[Measures].[Internet Order Count] 
    ) 
    ) 
SELECT 
    {[Measures].[Internet Order Count]} ON COLUMNS 
, 
    [Country].[Country].MEMBERS 
    * 
    { 
     [Top5StatesPerCountry] 
    ,[State-Province].[All] 
    } ON ROWS 
FROM [Adventure Works]; 

編輯

你可以修改立即上面這個腳本:

WITH 
    SET [Top5StatesPerCountry] AS 
    Generate 
    (
     [Country].[Country].MEMBERS 
    ,TopCount 
     (
     (EXISTING 
      [State-Province].[State-Province].MEMBERS) 
     ,5 
     ,[Measures].[Internet Order Count] 
    ) 
    ) 
    MEMBER [State-Province].[State-Province].[AGGREGTOP5] AS 
    AGGREGATE(EXISTING [Top5StatesPerCountry]) 
SELECT 
    {[Measures].[Internet Order Count]} ON COLUMNS 
, 
    [Country].[Country].MEMBERS 
    * 
    { 
     [Top5StatesPerCountry] 
    ,[State-Province].[All] 
    ,[State-Province].[State-Province].[AGGREGTOP5] 
    } ON ROWS 
FROM [Adventure Works]; 
+0

嘿@whytheq,感謝您的幫助,但是當我這樣做時,它總計的全部價值,而不是前5的價值。對不起,我相信我原來的帖子是誤導。無論如何總共只有前五名? (你的回答讓我與另一個查詢雖然) –

+1

@WillWainwright威爾嗨 - 我敢肯定的東西是可能的 - 但你需要鼓勵通過提高按鈕(不是一個非常微妙的暗示)人 – whytheq

+0

@WillWainwright喜會 - 我加對最後一個腳本有一些更多的邏輯 - 不幸的是,我幾天沒有接近SSAS,因此目前無法測試這個添加 - 希望它有助於總結Top5。 – whytheq