Расчет совокупной суммы в многомерных выражениях

Мне нужен запрос многомерных выражений, который возвращает верхние 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. Это достаточно просто.

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

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

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


person Carlos    schedule 10.09.2010    source источник


Ответы (1)


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

В [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
person Marc Polizzi    schedule 11.09.2010
comment
Спасибо. Я еще не смог попробовать это решение, но, похоже, попробовать стоит. - person Carlos; 11.09.2010
comment
Дает мне именно те результаты, которые я хочу, так что еще раз спасибо. Единственная проблема в том, что он очень медленный, поэтому я должен посмотреть, смогу ли я его использовать. - person Carlos; 13.09.2010
comment
И еще есть одна маленькая проблема: я хочу получить хотя бы 1000 граммов мяса. Это решение не будет включать в результаты продукт, общая сумма которого превысит 1000 грамм. Таким образом, он возвращает только один продукт. - person Carlos; 13.09.2010