Расчет кумулятивной суммы в MDX
-
02-10-2019 - |
Вопрос
Мне нужен запрос 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 |
Итак, чтобы получить то, что я хочу, я бы сначала пошел по долю в процентах, чтобы удовлетворить мой первый приоритет. Тогда я бы сумма веса продуктов, пока не достигнет 1000 грамма. Результатом должен быть продуктом 2, продукт 4 и продукт 5. Это достаточно просто.
Но можно ли сделать это в MDX? TopPercent
(или в случае примера, TopSum
) В противном случае был бы идеальным, но он не позволяет мне использовать различные меры для сортировки и суммирования. Если бы я хотел только продукты, которые весом больше всего, она будет работать. Чтобы процитировать документацию, функция:
Сортирует набор в порядке убывания и возвращает набор кортежей с наивысшими значениями, совокупный общий объем которых равен или превышает указанный процент.
Что я в основном нужно, это TopPercent
Функция, которая не сортирует набор, но, насколько я знаю, нет. Так можно сделать то, что я хочу или я должен рассчитать это в сервере?
Решение
Как насчет объединения порядка () сначала заставить ваши продукты сортироваться в соответствии с их процентом мяса, а затем фильтровать () их в соответствии с их совокупным весом?
В [Приключение работает] Следующий код показывает наиболее упорядоченные горные велосипеды, чья кумулятивная сумма продаж ниже до определенного значения:
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