我需要一个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
函数,它不会对集合进行排序,但据我所知,没有。那么有可能做我想要的或者我必须在服务器代码中计算它吗?
答案 0 :(得分:5)
如何首先合并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