已排序MDX查询添加累计求和列异常问题咨询
解决MDX排序后累计求和不按指定顺序计算的问题
你遇到的核心问题是:行轴上的排序仅改变结果的展示顺序,但Aggregate({FirstChild:CurrentMember})是基于维度成员的固有层级顺序计算的,和行轴的排序逻辑无关。所以即便你把产品按销售额降序展示,累计求和依然会按照产品名称的默认顺序累加,导致结果和预期不符。
方法1:利用命名集+Rank+Head实现排序后累计
先将排序后的产品集合定义为命名集,再通过Rank获取当前成员在排序集合中的位置,最后用Head截取该位置之前的所有成员进行聚合:
WITH -- 定义按销售额降序排序的产品命名集 SET SortedProducts AS Order( [Dim Product].[ProductName].[ProductName], [Measures].[Sales Amount], Desc ) -- 计算累计求和:取排序集合中从第一个到当前成员的子集进行聚合 MEMBER RunningTotal AS Aggregate( Head(SortedProducts, Rank([Dim Product].[ProductName].CurrentMember, SortedProducts)), [Measures].[Sales Amount] ) SELECT {[Measures].[Sales Amount], RunningTotal} ON 0, -- 直接使用排序后的命名集,同时过滤空值 NonEmpty(SortedProducts) ON 1 FROM [InternetSales];
方法2:用Generate遍历排序集合实现累计
通过Generate遍历排序集合中当前成员及之前的所有元素,逐个累加销售额:
WITH SET SortedProducts AS Order( [Dim Product].[ProductName].[ProductName], [Measures].[Sales Amount], Desc ) MEMBER RunningTotal AS Sum( Generate( Head(SortedProducts, Rank([Dim Product].[ProductName].CurrentMember, SortedProducts)), {[Dim Product].[ProductName].CurrentMember} ), [Measures].[Sales Amount] ) SELECT {[Measures].[Sales Amount], RunningTotal} ON 0, NonEmpty(SortedProducts) ON 1 FROM [InternetSales];
额外优化:提前过滤空值
如果你的产品中有大量无销售额的记录,可以在定义命名集时直接加入NonEmpty,减少后续计算量:
SET SortedProducts AS Order( NonEmpty([Dim Product].[ProductName].[ProductName], [Measures].[Sales Amount]), [Measures].[Sales Amount], Desc )
内容的提问来源于stack exchange,提问作者shabnam aboulghasem
相关产品推荐
相关产品推荐

