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

SSAS表格模型Cube中MDX查询返回重复行及相关疑问

SSAS MDX查询重复行及语法疑问解答

嘿,作为刚接触SSAS Cube和MDX的新手,遇到这些问题太正常了,我来帮你逐一理清:


一、添加[Parent_Details].[Unit_Name]后出现重复行的原因

你碰到的重复行问题,核心是维度交叉连接产生了不必要的笛卡尔积。当你在ROWS子句里用*把[Suggestions]的多个层级和[Parent_Details].[Unit_Name]层级做交叉时,如果这两个维度在Cube里没有建立正确的关联关系(比如关联是一对多、多对多,或者根本没有通过事实表关联),MDX就会返回所有可能的成员组合,而不是仅存在实际对应关系的组合。

举个简单例子:如果1条Suggestions记录能匹配3条Unit_Name记录,交叉后这条记录就会被重复3次。给你两个解决方向:

  • 检查Cube中[Suggestions]和[Parent_Details]的维度关系:确保它们通过事实表的外键正确关联,这样MDX会自动过滤掉无对应关系的无效组合;
  • 确认NON EMPTY是否生效——虽然你已经加了,但有时候需要把它更精准地应用到交叉后的集,或者对[Parent_Details]的成员集添加过滤,只返回和当前Suggestions条目关联的Unit_Name。

二、关于.ALLMEMBERS *的作用

咱们拆成两部分看:

  1. .ALLMEMBERS的功能:这个函数会返回指定层级的所有成员,包括你可能在Cube里定义的计算成员。如果省略它,MDX默认会用MEMBERS函数,这个函数只返回层级里的非计算成员。如果你的[Suggestions]各层级没有任何计算成员,那MEMBERS和ALLMEMBERS的结果完全一致,所以你注释掉后看起来没变化。
  2. *的功能:这是MDX的交叉连接运算符,用来把多个成员集组合成笛卡尔积。比如Set1 * Set2会返回Set1里每个成员和Set2里每个成员的所有可能组合。你的查询里用*连接[Suggestions]的多个层级,本质就是把这些层级的成员做全组合。

三、为什么维度引用是[Suggestions].[Parent_id].[Parent_id]

MDX里引用维度成员集时,需要明确指定到层级级别,这个格式是有讲究的:

  • [Suggestions]是维度的名称;
  • 第一个[Parent_id]是该维度下的一个层次结构(Hierarchy);
  • 第二个[Parent_id]是这个层次结构里的具体层级(Level)。

如果只写[Suggestions].[Parent_id],MDX会认为你指的是整个层次结构,而在交叉连接中我们需要的是该层次结构下某个层级的成员集,所以查询设计器会自动生成到具体层级的引用,避免歧义。


内容的提问来源于stack exchange,提问作者StackTrace

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 10:09:48