Power BI中如何构建支持页面筛选的取派件站点绩效统计计算表
方案1:Power Query预处理+星型模型(推荐,性能最优,筛选天然生效)
这是最稳妥的落地方式,不需要编写复杂DAX,所有页面筛选条件可100%响应:
- 第一步:在Power Query中复制原始Orders表,命名为Order_Stops
- 第二步:对Order_Stops表执行逆透视操作:选中
Pickup Stop和Delivery Stop两列,右键选择「逆透视列」,得到两个新字段:- 属性:值为
Pickup Stop/Delivery Stop,标识当前行是取货还是交货记录 - 值:对应站点名称,重命名为
Stop Location
- 属性:值为
- 第三步:基于Order_Stops表的
Stop Location字段去重生成独立站点维度表Stops_Dim,和Order_Stops表建立一对多关系 - 第四步:编写4个基础度量值:
取货次数 = CALCULATE(COUNT('Order_Stops'[ID]), 'Order_Stops'[属性] = "Pickup Stop") 取货收入 = CALCULATE(SUM('Order_Stops'[Rev $]), 'Order_Stops'[属性] = "Pickup Stop") 交货次数 = CALCULATE(COUNT('Order_Stops'[ID]), 'Order_Stops'[属性] = "Delivery Stop") 交货收入 = CALCULATE(SUM('Order_Stops'[Rev $]), 'Order_Stops'[属性] = "Delivery Stop") - 第五步:报表组件直接拖入Stops_Dim的
Stop Location字段+以上4个度量值即可,所有筛选条件(订单区间、收入范围、站点筛选等)都会正常生效。
方案2:纯DAX动态计算方案(无需修改原始表结构)
如果无法调整原始数据模型,可通过动态度量值实现需求,不需要预先生成静态计算表:
- 第一步:先创建独立的站点维度表(不需要和Orders表建立关系),可用DAX直接生成:
Stops_Dim = DISTINCT(UNION(VALUES(Orders[Pickup Stop]), VALUES(Orders[Delivery Stop]))) - 第二步:编写4个动态度量值,用TREATAS传递筛选上下文:
取货次数 = VAR 当前站点 = SELECTEDVALUE(Stops_Dim[Stop Location]) RETURN CALCULATE(COUNT(Orders[ID]), TREATAS({当前站点}, Orders[Pickup Stop]), ALLSELECTED(Orders)) 取货收入 = VAR 当前站点 = SELECTEDVALUE(Stops_Dim[Stop Location]) RETURN CALCULATE(SUM(Orders[Rev $]), TREATAS({当前站点}, Orders[Pickup Stop]), ALLSELECTED(Orders)) 交货次数 = VAR 当前站点 = SELECTEDVALUE(Stops_Dim[Stop Location]) RETURN CALCULATE(COUNT(Orders[ID]), TREATAS({当前站点}, Orders[Delivery Stop]), ALLSELECTED(Orders)) 交货收入 = VAR 当前站点 = SELECTEDVALUE(Stops_Dim[Stop Location]) RETURN CALCULATE(SUM(Orders[Rev $]), TREATAS({当前站点}, Orders[Delivery Stop]), ALLSELECTED(Orders)) - 第三步:拖入Stops_Dim的站点字段+4个度量值即可正常展示结果。
踩坑提示:不要直接用DAX生成静态物理计算表存储统计结果,物理计算表的计算发生在数据刷新阶段,不会响应报表运行时的筛选操作,这是此前方案筛选失效的核心原因。
内容的提问来源于stack exchange,提问作者Evan Swanzy
相关产品推荐
相关产品推荐

