我需要编写一个DAX语句,从概念/逻辑的角度来看有点复杂 - 所以这可能很难解释。
我有两张桌子。
在第一张表(如下所示)上,我有一个数值列表(工资)。对于每个值,我都有相应的日期范围。我也有EmployeeID和FunctionID。此表的目的是跟踪在特定日期范围内为执行特定功能的员工支付的每小时工资。每个功能在工资表上都有自己的工资,但是每个员工可能会为同一个职能获得不同的工资(还有职能和员工的维度)。
'Wages'
Wage StartDate EndDate EmployeeID FunctionID
20 1/1/2016 1/30/2016 3456 20
15 1/15/2016 2/12/2016 3456 22
27.5 1/20/2016 2/20/2016 7890 20
20 1/21/2016 2/10/2016 1234 19
在'表2'中,我有一个员工每天工作某个功能的记录。请记住,表1包含每个功能的工资信息。
'Table 2'
Date EmployeeID FunctionID DailyWage
1/1/2016 1234 $20 =CALCULATE( SUMX( ??? ) )
1/2/2016 1234 $20 =CALCULATE( SUMX( ??? ) )
1/3/2016 1234 $22 see below
1/4/2016 1234 $22
1/1/2016 4567 $27
1/2/2016 4567 $27
1/3/2016 4567 $27
(请注意,工资可能随时间而变化)
我要做的是在'Table 2'上创建一个名为'DailyWage'的计算列。我希望“表2”中的每一行都告诉我全天支付EmployeeID的数量(假设工作日为8小时)。
我真的在努力学习逻辑步骤,所以我不确定这个计算的最佳方法是......
更糟糕的是,EmployeeID可能会在不同的日期为同一个函数支付不同的工资。他们可能从一个工资函数X开始,然后通常,他们的工资将在未来几个月上升...这意味着如果我尝试连接EmployeeID和FunctionID,我将无法连接连接值上的表,因为这两个表都没有唯一值。
换句话说,如果我们将EmployeeID和FunctionID连接到EmpFunID,我们需要将EmpFunID +当前行的日期,然后说“在当前行中获取EmpFunID,再加上当前行的日期然后从具有相同EmpFunID的Wages表上的Wage列返回值,其StartDate小于CurrentRowDate AND的EndDate大于CurrentRowDate
这就是我所做的事情:
Step 1 = Filter 'Wages' table so that StartDate < CurrentRowDate
Step 2 = Filter 'Wages' table so that EndDate > CurrentRowDate
Step 3 = LOOKUPVALUE( 'Wages'[Wage], 'Wages'[EmpFunID], Table2[EmpFunID])
现在我只需将其转换为DAX函数。
答案 0 :(得分:1)
不确定是否完全正确,但也许类似的东西?如果将此作为计算列放入Table2,它会将Table2的当前行上下文转换为过滤器上下文。
因此,SUMX将使用Table2中当前行的数据,并对工资表的过滤版本进行总结:工资表将使用Table2中的当前日期,employeeid和functionid进行过滤,并且对于Table2中的每一行,itt只会将那些属于当前行的工资加起来。
CALCULATE(
SUMX(
FILTER(
'Wages',
'Wages'[StartDate] >= 'Table2'[Date],
'Wages'[EndDate] <= 'Table2'[Date],
'Wages'[EmployeeId] = 'Table2'[EmployeeId],
'Wages'[FunctionId] = 'Table2'[FunctionId]
),
'Wages'[Wage]
)