Расчет накопленной суммы в MDX - PullRequest
1 голос
/ 10 сентября 2010

Мне нужен запрос MDX, который возвращает верхние N процентов строк на основе совокупной суммы меры. Сложность в том, что набор должен быть упорядочен на основе меры, отличной от той, которая используется для суммы, поэтому использование функции TopPercent невозможно.

Чтобы уточнить, что мне нужно, вот пример. Я хочу купить как минимум 1000 граммов мяса в как можно меньшем количестве упаковок. Тем не менее, речь идет не только о весе упаковки, я хочу качество, поэтому я хочу отдавать приоритет продуктам, которые содержат самый высокий процент мяса. Доступны следующие продукты:

|| Name      || Weight || PercentageOfMeat ||
| Product 1  | 500     |  20               |
| Product 2  | 250     |  60               |
| Product 3  | 1000    |  25               |
| Product 4  | 400     |  50               |
| Product 5  | 400     |  40               |

Итак, чтобы получить то, что я хочу, я сначала отсортировал бы по убыванию по PercentageOfMeat, чтобы удовлетворить свой первый приоритет. Затем я бы суммировал веса продуктов кумулятивно, пока не достигну предела в 1000 грамм. Результатом должны быть продукт 2, продукт 4 и продукт 5. Это достаточно просто.

Но возможно ли это сделать в MDX? TopPercent (или в случае с примером TopSum) в противном случае было бы идеально, но это не позволяет мне использовать различные меры для сортировки и суммирования. Если бы я хотел только продукты, которые весят больше всего, это сработало бы. Чтобы процитировать документацию, функция:

Сортирует набор в порядке убывания и возвращает набор кортежей с наивысшими значениями, совокупная сумма которых равна или превышает указанный процент.

Что мне в основном нужно, так это TopPercent функция, которая не сортирует множество, но, насколько я знаю, ее нет. Так можно ли делать то, что я хочу, или мне нужно рассчитать это в коде сервера?

1 Ответ

5 голосов
/ 11 сентября 2010

Как насчет того, чтобы сначала объединить Order (), чтобы отсортировать ваши продукты в соответствии с их процентным содержанием мяса, а затем отфильтровать () в соответствии с их совокупным весом?

В [Adventure Works] показан следующий коднаиболее заказанные горные велосипеды, совокупный объем продаж которых ниже определенного значения:

with 

   set [mbikes] as order( [Product].[Product Categories].[mountain bikes].children, [order count], BDESC ) 

select 

    { [order count], [sales amount] } on 0,

    filter( [mbikes], sum( subset( [mbikes], 0, [mbikes].currentOrdinal ), [sales amount] ) < (8 * 1000 * 1000)  ) on 1 

from [adventure works]  

, что дает следующее значение:

                          Order Count    Sales Amount
Mountain-200 Black, 38          743      $2,589,363.78
Mountain-200 Black, 42          671      $2,265,485.38
Mountain-200 Silver, 38         641      $2,160,981.60
...