2015-05-05 2 views
1

Я пытаюсь создать MDX-запрос для расчета лучших магазинов для продажи на территории, а затем подтереть территорию.MDX Top Count Sub

Я использовал функцию TOPCOUNT с функцией GENERATE для создания SET для верхних местоположений, однако у меня возникают реальные проблемы с попыткой суммировать каждую территорию.

Мой 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

привет - Вы нашли ответ на свой вопрос? – whytheq

ответ

1

Попробуйте union с All члена:

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

Но следующее более простое решение, которое не заморачиваться с union внутри generate:

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]; 

Edit

Вы можете изменить сценарий непосредственно над этой:

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. Извините, я полагаю, что мое оригинальное сообщение вводило в заблуждение. Есть ли вообще все вершины только 5? (Ваш ответ помог мне с другим вопросом, хотя) –

+1

@WillWainwright Hi Will - я уверен, что что-то возможно, но вам нужно поощрять людей с помощью кнопки вверх (не очень тонкий намек) – whytheq

+0

@WillWainwright привет - я добавил еще немного логики к последнему сценарию - к сожалению, я не близок к SSAS в течение нескольких дней, поэтому в настоящее время не могу проверить это дополнение - надеюсь, это поможет подвести Top5 для вас. – whytheq