在MDX中计算累计总和
问题描述:
我需要一个MDX查询,它根据度量的累计和返回前N%的行。棘手的部分是该组必须基于与用于总和的不同度量来进行排序,所以使用TopPercent
函数是不可能的。在MDX中计算累计总和
为了说明我需要什么,下面是一个例子。我想尽可能少地购买至少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
函数不排序集,但据我所知,没有。那么是否有可能做我想做的或者我必须在服务器代码中进行计算?
答
如何组合订单(),首先根据肉类的百分比对产品进行分类,然后根据其累计重量过滤()它们?
在[艾德]下面的代码是呈现出最有序的山地自行车,其累计销售额为低到一定值:
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
谢谢。我还没有能够尝试这种解决方案,但它似乎值得一试。 – Carlos 2010-09-11 16:04:57
给我完全我想要的结果,所以再次感谢你。唯一的问题是它很慢,所以我必须看看我是否可以真正使用它。 – Carlos 2010-09-13 08:03:24
还有一个小问题,我希望至少得到1000克肉。该解决方案不会在结果中包含会导致总计超过1000克的产品。所以它只返回一个产品。 – Carlos 2010-09-13 08:30:18