Power Pivot中基于透视表汇总值计算DAX标准差测度的实现问题
问题根因
当前Standard Dev公式的计算逻辑存在本质偏差:
- 用
ALLSELECTED(Table1)清空全表筛选上下文后,STDEVX.P会逐行遍历原数据表的明细行,针对每个明细行单独计算[Time per unit]值,再对所有行级单值计算标准差——本质完全没有用到透视表上按日期聚合后的Time per unit汇总值集合,这也是为什么所有日期行显示的标准差都是固定的全量明细计算结果。 - 之前搭配FILTER、KEEPFILTERS等函数没有生效,核心原因是没有先完成“提取透视表当前可见的所有维度聚合值”这一步,计算始终回到了表明细行上下文。
修正方案
调整公式逻辑,优先提取透视表当前展示范围内、每个分组维度下聚合好的Time per unit值,再对这组聚合值计算标准差:
Standard Dev = // 提取当前筛选范围内,透视表可见的所有日期维度分组的聚合值 VAR _visible_group_metrics = SUMMARIZE( ALLSELECTED('Table1'[日期]), -- 匹配透视表行字段,只保留当前筛选范围的日期分组,不覆盖其他筛选条件 "_tpu", [Time per unit] -- 每个分组调用已经定义好的聚合测度,拿到对应汇总值 ) RETURN STDEVX.P(_visible_group_metrics, [_tpu])
公式匹配效果:只要当前透视表筛选范围覆盖了1/1/21到1/4/21这4个日期,这个测度就会先拿到4个日期分别对应的63.61、62.93、62.16、64.22四个汇总值,再对这组值计算整体标准差,最终所有日期行显示的标准差都是基于这组聚合值算出的0.76,和目标效果完全一致。
后续扩展提示
- 如果后续在透视表行上新增其他维度(比如产线、产品类别),只需要把SUMMARIZE函数中ALLSELECTED后的列改成对应的维度列集合即可,比如行上同时使用日期和产线,就调整为
ALLSELECTED('Table1'[日期], 'Table1'[产线]) - 后续要搭建的均值偏差测度,可以直接复用
_visible_group_metrics临时表,先计算这组聚合值的整体均值,再对当前行的[Time per unit]和均值做差,不需要重复写聚合逻辑。
内容的提问来源于stack exchange,提问作者Chris Z
相关产品推荐
相关产品推荐

