DIVIDE(DAX)跨表计算结果异常的技术求助
DAX写法修正方案
问题根源
你的DAX直接对两个事实表做SUM后除法,会因为Date一对多关系下的筛选上下文不匹配,导致数据被重复累加——两个表都按Date关联,但每个Date对应5个Building,跨表聚合时无法自动对齐Building维度,最终计算出的比率偏差极大。
修正后的DAX写法
方案1:按Date+Building粒度聚合后关联计算
Avg Allocated Utilization % = VAR UtilizationByBuilding = SUMMARIZE( 'Utilization Report', 'Utilization Report'[Date], 'Utilization Report'[Building], "Total_People", SUM('Utilization Report'[Average Person Count]) ) VAR CapacityByBuilding = SUMMARIZE( 'Capacity and Allocation', 'Capacity and Allocation'[Date], 'Capacity and Allocation'[Building], "Total_Allocated", SUM('Capacity and Allocation'[Allocated]) ) VAR CombinedData = NATURALLEFTOUTERJOIN(UtilizationByBuilding, CapacityByBuilding) RETURN DIVIDE( SUMX(CombinedData, [Total_People]), SUMX(CombinedData, [Total_Allocated]), 0 )
- 逻辑:先分别在两个表中按「日期+建筑」分组聚合数据,再将两组数据按相同维度关联,最后计算总人数与总分配量的比率,彻底避免跨表直接SUM的重复计算问题。
方案2:用ALLEXCEPT锁定筛选上下文(适用于有独立Building维度表的星型模型)
Avg Allocated Utilization % = DIVIDE( CALCULATE(SUM('Utilization Report'[Average Person Count]), ALLEXCEPT('Utilization Report', 'Building'[Building], 'Date'[Date])), CALCULATE(SUM('Capacity and Allocation'[Allocated]), ALLEXCEPT('Capacity and Allocation', 'Building'[Building], 'Date'[Date])), 0 )
- 逻辑:通过
ALLEXCEPT强制保留「建筑+日期」的筛选上下文,让两个表的聚合都严格按每个建筑每天的粒度计算,确保分子分母的统计维度完全匹配。
额外调整说明
如果你的需求是每日每个建筑利用率的平均值(而非总人数/总分配量的整体比率),将方案1的最后一步改为:
RETURN AVERAGEX( CombinedData, DIVIDE([Total_People], [Total_Allocated], 0) )
前置检查
确保两个事实表中的Building字段值完全一致(包括大小写、空格、特殊字符),否则维度关联会失效,导致数据缺失或计算错误。
内容的提问来源于stack exchange,提问作者Ryan
相关产品推荐
相关产品推荐

