在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 
+0

谢谢。我还没有能够尝试这种解决方案,但它似乎值得一试。 – Carlos 2010-09-11 16:04:57

+0

给我完全我想要的结果,所以再次感谢你。唯一的问题是它很慢,所以我必须看看我是否可以真正使用它。 – Carlos 2010-09-13 08:03:24

+0

还有一个小问题,我希望至少得到1000克肉。该解决方案不会在结果中包含会导致总计超过1000克的产品。所以它只返回一个产品。 – Carlos 2010-09-13 08:30:18