2015-05-21 2 views
0

Как мне получить продажи последнего продукта крест-соединения каждой группы продуктов и бренда? Я посмотрел на функцию Tail, но я не могу заставить ее работать правильно.Эквивалент максимальной группе по mdx

Это MDX я до сих пор:

SELECT {[Measures].[Sales Amount]} ON COLUMNS, 
{ 
    [Dim Brands].[Brand Name].[Brand Name].ALLMEMBERS * 
    [Dim Product Groups].[Product Group Name].[Product Group Name].ALLMEMBERS * 
    Tail ([Dim Products].[Product Name].[Product Name].ALLMEMBERS) 
} 

Это возвращает только последний продукт для всего куба, а не последний продукт для каждой марки и группы товаров.

+0

вы хотите последний '[Имя продукта]' для каждого '[Group Название продукта]'? Или вам просто нужен последний член '[Product Name]' для каждого '[Product Group Name]'? – whytheq

+0

last [Product Name Name] для каждого [Название группы продуктов] –

ответ

2

Вы можете использовать функцию GENERATE, чтобы сгенерировать продукт для каждой группы товаров или брендов и продуктов. EXISTING заботится об объеме.

WITH SET LastProductForEachBrandAndProductGroup AS 

    GENERATE 

    (
     EXISTING 
     NonEmpty 
     (
      [Dim Brands].[Brand Name].[Brand Name].ALLMEMBERS, [Dim Product Groups].[Product Group Name].[Product Group Name].ALLMEMBERS 
     ) 

    , 

    Tail (
      [Dim Products].[Product Name].[Product Name].ALLMEMBERS 
     ) 

    ) 


SELECT {[Measures].[Sales Amount]} ON COLUMNS, 
NonEmpty({ 
    [Dim Brands].[Brand Name].[Brand Name].ALLMEMBERS * 
    [Dim Product Groups].[Product Group Name].[Product Group Name].ALLMEMBERS * 
    LastProductForEachBrandAndProductGroup 
}) ON ROWS 
FROM YourCube 

Если на прошлом, вы подразумеваете последний элемент в любом списке отсортированы (по какой-то мере), выше потребуется немного больше работы. Дайте мне знать, как это работает для вас.

+0

, что имеет смысл. Я дам ему скоро и сообщит, как это получится. –

+0

запрос занимает слишком много времени, чтобы закончить, я посмотрю на улучшая его производительность, и если он работает, я отмечу это как ответ благодаря –

+0

Отредактировал свой ответ, добавив 'NonEmpty'. Пожалуйста, проверьте, работает ли оно быстрее. – SouravA

2

Разделение комплектов должно ускорить выполнение этого сценария. Как следующее:

WITH 
    SET [allBrands] AS 
    [Dim Brands].[Brand Name].[Brand Name].ALLMEMBERS 
    SET [allGroups] AS 
    [Dim Product Groups].[Product Group Name].[Product Group Name].ALLMEMBERS 
    SET [A] AS 
    Generate 
    (
     {[allBrands] * [allGroups]} AS s 
    , 
     s.Current 
     * 
     Tail 
     (
      NonEmpty 
      (
      [Dim Products].[Product Name].[Product Name].ALLMEMBERS 
      ,[Measures].[Sales Amount] 
     ) 
     ,1 
     ) 
    ) 
SELECT 
    NON EMPTY 
    {[Measures].[Sales Amount]} ON 0 
,NON EMPTY 
    [A] ON 1 
FROM [YourCube]; 

против AdvWrks Microsoft, подобное, и, возможно, более полезным, вариант приведенного выше, будет использовать TopCount, а не слегка artitrary Tail:

WITH 
    SET [allYears] AS 
    [Date].[Calendar].[Calendar Year].MEMBERS 
    SET [allCountries] AS 
    [Customer].[Customer Geography].[Country].MEMBERS 
    SET [A] AS 
    Generate 
    (
    {[allYears] * [allCountries]} AS s 
    , 
     s.Current 
     * 
     TopCount 
     (
      [Product].[Product Categories].[Product].ALLMEMBERS 
     ,2 
     ,[Measures].[Internet Sales Amount] 
     ) 
    ) 
SELECT 
    {[Measures].[Internet Sales Amount]} ON 0 
,[A] ON 1 
FROM [Adventure Works]; 

Это приводит к следующим :

enter image description here

Смежные вопросы