DAX 计算列基于来自其他 table 的两列
DAX Calculated column based on two columns from other table
我需要编写一个 DAX 语句,从 conceptual/logical 的角度来看它有点复杂 - 所以这可能很难解释。
我有两个 table。
在第一个 table(如下所示)中,我有一个数值列表(工资)。对于每个值,我都有一个相应的日期范围。我还有 EmployeeID 和 FunctionID。此 table 的目的是跟踪支付给在特定日期范围内执行特定职能的员工的小时工资。每个职能部门都有自己的工资 table,但是 每个员工可能会因同一职能获得不同的工资 (职能和员工也有一个维度)。
'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
在 'Table 2' 我有一个员工每天从事某个职能的记录。请记住,Table 1 包含每个职能部门的工资信息。
'Table 2'
Date EmployeeID FunctionID DailyWage
1/1/2016 1234 =CALCULATE( SUMX( ??? ) )
1/2/2016 1234 =CALCULATE( SUMX( ??? ) )
1/3/2016 1234 see below
1/4/2016 1234
1/1/2016 4567
1/2/2016 4567
1/3/2016 4567
(注意工资会随时间变化)
我想做的是在 'Table 2' 上创建一个名为 'DailyWage' 的计算列。我希望 'Table 2' 上的每一行都告诉我 EmployeeID 全天的薪水(假设工作日 8 小时)。
我真的很难理解逻辑步骤,所以我不确定进行此计算的最佳方法是什么...
更糟糕的是,EmployeeID 可能会在不同的日期为相同的职能部门支付不同的工资。他们可能从一个工资工作功能 X 开始,然后一般来说,他们的工资应该在未来几个月上涨......这意味着如果我尝试连接 EmployeeID 和 FunctionID,我将无法连接连接值上的 table,因为 table 都不具有唯一值。
所以换句话说,如果我们将 EmployeeID 和 FunctionID 连接到 EmpFunID,我们需要获取 EmpFunID + 当前行的日期,然后说“获取当前行的 EmpFunID,加上日期当前行,然后 return Wages table 上 Wage 列的值具有相同的 EmpFunID 并且 StartDate 小于 CurrentRowDate 并且 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 函数。
不确定是否完全正确,但也许类似?如果将其作为计算列放入 Table2,它会将 Table2 的当前行上下文转换为筛选器上下文。
因此 SUMX 将使用 Table2 中当前行的数据,并将对工资的过滤版本求和 table:工资 table 将使用当前日期、employeeid 进行过滤和表 2 中的 functionid,对于表 2 中的每一行,itt 只会对属于当前行的工资求和。
CALCULATE(
SUMX(
FILTER(
'Wages',
'Wages'[StartDate] >= 'Table2'[Date],
'Wages'[EndDate] <= 'Table2'[Date],
'Wages'[EmployeeId] = 'Table2'[EmployeeId],
'Wages'[FunctionId] = 'Table2'[FunctionId]
),
'Wages'[Wage]
)
我需要编写一个 DAX 语句,从 conceptual/logical 的角度来看它有点复杂 - 所以这可能很难解释。
我有两个 table。
在第一个 table(如下所示)中,我有一个数值列表(工资)。对于每个值,我都有一个相应的日期范围。我还有 EmployeeID 和 FunctionID。此 table 的目的是跟踪支付给在特定日期范围内执行特定职能的员工的小时工资。每个职能部门都有自己的工资 table,但是 每个员工可能会因同一职能获得不同的工资 (职能和员工也有一个维度)。
'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
在 'Table 2' 我有一个员工每天从事某个职能的记录。请记住,Table 1 包含每个职能部门的工资信息。
'Table 2'
Date EmployeeID FunctionID DailyWage
1/1/2016 1234 =CALCULATE( SUMX( ??? ) )
1/2/2016 1234 =CALCULATE( SUMX( ??? ) )
1/3/2016 1234 see below
1/4/2016 1234
1/1/2016 4567
1/2/2016 4567
1/3/2016 4567
(注意工资会随时间变化)
我想做的是在 'Table 2' 上创建一个名为 'DailyWage' 的计算列。我希望 'Table 2' 上的每一行都告诉我 EmployeeID 全天的薪水(假设工作日 8 小时)。
我真的很难理解逻辑步骤,所以我不确定进行此计算的最佳方法是什么...
更糟糕的是,EmployeeID 可能会在不同的日期为相同的职能部门支付不同的工资。他们可能从一个工资工作功能 X 开始,然后一般来说,他们的工资应该在未来几个月上涨......这意味着如果我尝试连接 EmployeeID 和 FunctionID,我将无法连接连接值上的 table,因为 table 都不具有唯一值。
所以换句话说,如果我们将 EmployeeID 和 FunctionID 连接到 EmpFunID,我们需要获取 EmpFunID + 当前行的日期,然后说“获取当前行的 EmpFunID,加上日期当前行,然后 return Wages table 上 Wage 列的值具有相同的 EmpFunID 并且 StartDate 小于 CurrentRowDate 并且 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 函数。
不确定是否完全正确,但也许类似?如果将其作为计算列放入 Table2,它会将 Table2 的当前行上下文转换为筛选器上下文。
因此 SUMX 将使用 Table2 中当前行的数据,并将对工资的过滤版本求和 table:工资 table 将使用当前日期、employeeid 进行过滤和表 2 中的 functionid,对于表 2 中的每一行,itt 只会对属于当前行的工资求和。
CALCULATE(
SUMX(
FILTER(
'Wages',
'Wages'[StartDate] >= 'Table2'[Date],
'Wages'[EndDate] <= 'Table2'[Date],
'Wages'[EmployeeId] = 'Table2'[EmployeeId],
'Wages'[FunctionId] = 'Table2'[FunctionId]
),
'Wages'[Wage]
)