PowerPivot多引用问题:CROSSFILTER失效,无法计算员工工种成本
员工组-工种成本计算问题及DAX解决方案
需求说明
需要计算不同员工的各工种成本,员工隶属于不同组,每组的各工种对应独立成本。现有员工表、交易记录表、成本表,以及处理多对多关系的组表、工种表,表间已建立关联,但编写的多个DAX度量值均未得到正确结果,期望结果见下方'Real'列,需解决CROSSFILTER失效及成本计算问题。
表结构
员工表(Employees)
Employee Name Group A aaa 1 B bbb 2 C ccc 1 D ddd 2
交易记录表(Transactions)
Date Employee Wtype Duration 01/11/2022 A X 1 02/11/2022 A Y 2 18/11/2022 B X 3 24/11/2022 C X 6 30/11/2022 D Y 3
成本表(Costs)
Group Wtype Cost 1 X 10 1 Y 30 2 X 20 2 Y 40
组表(Groups)- 处理多对多关系的单列表
Group 1 2
工种表(WTypes)- 处理多对多关系的单列表
Wtype X Y
表间关联关系
| Active | Table 1 | Cardinality | Filter direction | Table 2 |
|---|---|---|---|---|
| Yes | Costs [Group] | *:1 | << A Costs | Groups [Group] |
| Yes | Costs [Wtype] | *:1 | << A Costs | WTypes [Wtype] |
| Yes | Employees [Group] | *:1 | << A Employees | Groups [Group] |
| Yes | Transactions [Employee] | *:1 | << A Transactions | Employees [Employee] |
| Yes | Transactions [Wtype] | *:1 | << A Transactions | WTypes [Wtype] |
尝试过的DAX度量值
ACost:=AVERAGE(Costs[Cost]) BCost:=AVERAGEX(RELATEDTABLE(Costs);Costs[Cost]) CCost:=CALCULATE([BCost]) DCost:=CALCULATE([ACost];CROSSFILTER(Transactions[Wtype];WTypes[Wtype];Both)) ECost:=CALCULATE([ACost]; CROSSFILTER(Costs[Wtype];WTypes[Wtype];Both); CROSSFILTER(Costs[Group];Groups[Group];Both); CROSSFILTER(Transactions[Employee];Employees[Employee];Both); CROSSFILTER(Transactions[Wtype];WTypes[Wtype];Both))
计算结果与期望对比
| ACost | BCost | CCost | DCost | ECost | Real | |
|---|---|---|---|---|---|---|
| A - X | 25 | 25 | 25 | 15 | 15 | 10 |
| A - Y | 25 | 25 | 25 | 35 | 35 | 30 |
| B - X | 25 | 25 | 25 | 15 | 15 | 20 |
| C - X | 25 | 25 | 25 | 15 | 15 | 10 |
| D - Y | 25 | 25 | 25 | 35 | 35 | 40 |
解决方案
正确的DAX度量值
方法1:使用LOOKUPVALUE直接匹配对应组和工种的成本
RealCost := VAR CurrentEmployee = SELECTEDVALUE(Transactions[Employee]) VAR CurrentWtype = SELECTEDVALUE(Transactions[Wtype]) VAR EmployeeGroup = LOOKUPVALUE(Employees[Group], Employees[Employee], CurrentEmployee) RETURN LOOKUPVALUE(Costs[Cost], Costs[Group], EmployeeGroup, Costs[Wtype], CurrentWtype)
方法2:利用TREATAS传递筛选上下文到成本表
RealCost := CALCULATE( VALUES(Costs[Cost]), TREATAS(VALUES(Employees[Group]), Costs[Group]), TREATAS(VALUES(Transactions[Wtype]), Costs[Wtype]) )
问题原因说明
- 原度量值
ACost直接计算成本表的平均值,未应用任何员工或工种的筛选上下文,结果始终为所有成本的平均值(25)。 BCost使用RELATEDTABLE(Costs),但由于表间筛选方向为单向(从Groups/WTypes指向Costs,而非反向),员工和交易的筛选无法传递到成本表,导致仍取所有成本的平均。CROSSFILTER的使用未正确构建筛选路径:现有关系中,筛选无法从Transactions→Employees→Groups→Costs自动传递,需要通过TREATAS或LOOKUPVALUE明确关联员工组、工种与成本表的对应关系。
内容的提问来源于stack exchange,提问作者namregzepol
相关产品推荐
相关产品推荐

