【问题标题】:Calculating cumulative sum in MDX在 MDX 中计算累积和
【发布时间】:2010-09-10 14:15:30
【问题描述】:

我需要一个 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 函数,但据我所知,没有。那么是否可以做我想做的事,还是必须在服务器代码中计算?

【问题讨论】:

    标签: ssas mdx cumulative-sum


    【解决方案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
    

    【讨论】:

    • 谢谢。我还不能尝试这种解决方案,但似乎值得一试。
    • 给了我我想要的结果,所以再次感谢你。唯一的问题是它很慢,所以我必须看看我是否真的可以使用它。
    • 还有一个小问题,我想要至少 1000 克肉。该解决方案不会将导致总量超过 1000 克的产品包括在结果中。所以它返回一个产品短缺。
    猜你喜欢
    • 2014-05-15
    • 1970-01-01
    • 2021-10-24
    • 2019-08-23
    • 1970-01-01
    • 2019-06-06
    • 1970-01-01
    • 2020-11-04
    相关资源
    最近更新 更多