You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

已排序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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 07:13:32