Excel数据模型双事实表关联多对多维度透视值计算异常问题
问题背景
已将4张表(FACT1、FACT2、DIM1、DIM2)全部加载至Excel Data Model中,各表数据如下:
各表原始数据
FACT1
Code Month Value 058 1 500 059 1 600 061 1 700 058 2 1000 059 2 1000 061 2 1000
FACT2
Service Month Status Value 058-buy 1 OK 700 059-purchase 1 Missing 800 061-trade 1 OK 900 058-buy 2 OK 300 059-purchase 2 Missing 400 061-trade 2 OK 500
DIM1
Code Service 058 058-buy 059 059-purchase 061 061-trade
DIM2
Month Name 1 January 2 February 3 March
度量值与关系配置
在FACT1中创建了名为Value Total的度量值,公式为:
=sum([Value])+sumx(FILTER('FACT2','FACT2'[Status]="OK"),'FACT2'[VALUE])
已配置的表间关系如下:
- FACT1(Code) 关联 DIM1(Code)
- FACT2(Service) 关联 DIM1(Service)
- FACT1(Month) 关联 DIM2(Month)
- FACT2(Month) 关联 DIM2(Month)
透视表异常表现
基于该数据模型创建数据透视表时,将DIM1的Code字段放入行区域、FACT1的Month字段放入列区域、新建的Value Total度量值放入值区域,得到如下结果:
Code 1 2 Grand Total 058 1500 2000 2500 059 600 1000 1600 061 2100 2400 3100 Grand Total 4200 5400 7200
当前透视表的Grand Total列数值全部计算正确:
- 058对应2500为500 + 700 + 1000 + 300
- 059对应1600为600 + 1000
- 061对应3100为700 + 900 + 1000 + 500
- 最终Grand Total 7200也准确,月份维度切片在总计层级生效,但透视表的明细交叉单元格数值存在异常。
异常产生原因
核心问题是筛选上下文的传导出现了断层,具体逻辑:
- 透视表明细单元格的计算,需要同时匹配「行标签Code」+「列标签Month」两个维度的筛选条件,但你把列字段选成了
FACT1[Month],而不是公共维度表的DIM2[Month]。 - 度量值第一部分
SUM(FACT1[Value])计算完全正常:Code筛选通过DIM1传导到FACT1,Month筛选本身就打在FACT1表上,这部分的数值匹配没有问题。 - 度量值第二部分计算FACT2数值时,筛选传不过去:两个事实表没有直接关联,FACT1上的Month筛选不会自动传导到FACT2,只有Code维度的筛选能通过DIM1传到FACT2。也就是说计算明细单元格时,FACT2部分只会筛选当前Code下所有状态为OK的记录,不会做月份过滤。
- 拿058行1月的单元格举例:第一部分FACT1取到1月的500,第二部分FACT2会把058对应的所有OK状态值(1月700+2月300=1000)全部加总,最终得到1500的异常值;061行1月同理,FACT1取到700,加上FACT2中061所有OK值(1月900+2月500=1400)得到2100,和你看到的结果完全吻合。059行看起来数值正常,只是因为它在FACT2里没有状态为OK的记录,加总结果始终为0,看不出筛选问题。
- 总计层级数值正确只是巧合:行总计的月份筛选覆盖了所有月份,刚好和FACT2未被月份筛选的全量加总结果对齐,所以看起来数值是对的。
修复方式很简单:把透视表列区域的
FACT1[Month]替换成公共维度DIM2[Month],让月份筛选通过DIM2同时传导给两个事实表,明细单元格的计算就会恢复正常。
内容的提问来源于stack exchange,提问作者Carry Tiny
相关产品推荐
相关产品推荐

