DAX - 使用多个过滤器在行级别 (SUMX) 进行计算
DAX - Calculating at the Line Level (SUMX) with Multiple Filters
我想让 DAX 做的是:
- 查看 table HR 数据中的每一行。
- 确定员工的开始日期 ("employee a")
- 应用以下筛选器对 table 中的其他员工人数求和:
一种。成功完成任务
b.在开始日期 + 31
之前结束分配
C。在开始日期之后结束他们的分配 - 31(也就是说在员工 a 的开始日期的一个月内)
d.在员工 a 之前开始(不计算员工 a 或他们队列中的任何人)
e.与雇员 a 具有相同的职位。
这基本上是用普通英语问问题 "for each of my employees, how many other employees with the same job title ended their assignments successfully within a month of that employee starting?" 而在 DAX 中基本上只是 "how do I apply multiple filter criteria to a SUMX or COUNTAX measure/calculated column?"
我已经尝试过的措施是:
Contractors Available = COUNTAX(
'BAT VwRptMspAssignment',
CALCULATE(
DISTINCTCOUNT('BAT VwRptMspAssignment'[assignmentgk]),
FILTER(
FILTER(
FILTER(
FILTER(
FILTER(ALL('BAT VwRptMspAssignment'),
'BAT VwRptMspAssignment'[End.Date]<EARLIER('BAT VwRptMspAssignment'[Start.Date])+31),
'BAT VwRptMspAssignment'[End.Date]>EARLIER('BAT VwRptMspAssignment'[Start.Date])-31),
'BAT VwRptMspAssignment'[Start.Date]<EARLIER('BAT VwRptMspAssignment'[Start.Date])),
'BAT VwRptMspAssignment'[EoaReason]="Successful Completion"),
'BAT VwRptMspAssignment'[JobPostingTitle.1]=EARLIER('BAT VwRptMspAssignment'[JobPostingTitle.1]))
)
)
我试过的计算列是:
Contractors Available.1 = SUMX(
FILTER(
FILTER(
FILTER(
FILTER(
FILTER(
FILTER(ALL('BAT VwRptMspAssignment'),
'BAT VwRptMspAssignment'[customergk]=EARLIER('BAT VwRptMspAssignment'[customergk])),
'BAT VwRptMspAssignment'[JobPostingTitle.1]=EARLIER('BAT VwRptMspAssignment'[JobPostingTitle.1])),
'BAT VwRptMspAssignment'[End.Date]<EARLIER('BAT VwRptMspAssignment'[Start.Date])+31),
'BAT VwRptMspAssignment'[End.Date]>EARLIER('BAT VwRptMspAssignment'[Start.Date])-31),
'BAT VwRptMspAssignment'[Start.Date]<EARLIER('BAT VwRptMspAssignment'[Start.Date])),
'BAT VwRptMspAssignment'[EoaReason]="Successful Completion"),
'BAT VwRptMspAssignment'[FinishFlag])
但这些解决方案均无效。
有谁知道为什么或我还能尝试什么来实现这一目标?数据格式示例,导出为Excel:
"Contractors Available.2"是计算出来的列。
请注意第一行中的 521。如果我在 Excel 中应用所有这些过滤器,它应该为零,这个职位在数据集中是唯一的。它说 107 "Technical Writer - Expert" 行应该在 2017 年 9 月 26 日的一个月内结束,但这些是数据集中仅有的 3 位技术作家,其他两人中有零人在 9 月 30 日的一个月内结束了他们的任务/2016:
对计算列尝试这样的操作:
Contractors Available.1 =
VAR StartDate = 'BAT VwRptMspAssignment'[Start.Date]
VAR JobTitle = 'BAT VwRptMspAssignment'[JobPostingTitle.1]
RETURN
COUNTROWS (
FILTER (
'BAT VwRptMspAssignment',
'BAT VwRptMspAssignment'[End.Date] < StartDate + 31
&& 'BAT VwRptMspAssignment'[End.Date] > StartDate - 31
&& 'BAT VwRptMspAssignment'[Start.Date] < StartDate
&& 'BAT VwRptMspAssignment'[EoaReason] = "Successful Completion"
&& 'BAT VwRptMspAssignment'[JobPostingTitle.1] = JobTitle
)
)
EARLIER 函数不是必需的,因为变量将保留定义它们的上下文,即行上下文。
编辑:
我用您提供的数据测试了我的公式,它似乎有效。我更改了第二行中的 [End.Date],以在第一行中获得结果。
我想让 DAX 做的是:
- 查看 table HR 数据中的每一行。
- 确定员工的开始日期 ("employee a")
- 应用以下筛选器对 table 中的其他员工人数求和:
一种。成功完成任务
b.在开始日期 + 31
之前结束分配 C。在开始日期之后结束他们的分配 - 31(也就是说在员工 a 的开始日期的一个月内)
d.在员工 a 之前开始(不计算员工 a 或他们队列中的任何人)
e.与雇员 a 具有相同的职位。
这基本上是用普通英语问问题 "for each of my employees, how many other employees with the same job title ended their assignments successfully within a month of that employee starting?" 而在 DAX 中基本上只是 "how do I apply multiple filter criteria to a SUMX or COUNTAX measure/calculated column?"
我已经尝试过的措施是:
Contractors Available = COUNTAX(
'BAT VwRptMspAssignment',
CALCULATE(
DISTINCTCOUNT('BAT VwRptMspAssignment'[assignmentgk]),
FILTER(
FILTER(
FILTER(
FILTER(
FILTER(ALL('BAT VwRptMspAssignment'),
'BAT VwRptMspAssignment'[End.Date]<EARLIER('BAT VwRptMspAssignment'[Start.Date])+31),
'BAT VwRptMspAssignment'[End.Date]>EARLIER('BAT VwRptMspAssignment'[Start.Date])-31),
'BAT VwRptMspAssignment'[Start.Date]<EARLIER('BAT VwRptMspAssignment'[Start.Date])),
'BAT VwRptMspAssignment'[EoaReason]="Successful Completion"),
'BAT VwRptMspAssignment'[JobPostingTitle.1]=EARLIER('BAT VwRptMspAssignment'[JobPostingTitle.1]))
)
)
我试过的计算列是:
Contractors Available.1 = SUMX(
FILTER(
FILTER(
FILTER(
FILTER(
FILTER(
FILTER(ALL('BAT VwRptMspAssignment'),
'BAT VwRptMspAssignment'[customergk]=EARLIER('BAT VwRptMspAssignment'[customergk])),
'BAT VwRptMspAssignment'[JobPostingTitle.1]=EARLIER('BAT VwRptMspAssignment'[JobPostingTitle.1])),
'BAT VwRptMspAssignment'[End.Date]<EARLIER('BAT VwRptMspAssignment'[Start.Date])+31),
'BAT VwRptMspAssignment'[End.Date]>EARLIER('BAT VwRptMspAssignment'[Start.Date])-31),
'BAT VwRptMspAssignment'[Start.Date]<EARLIER('BAT VwRptMspAssignment'[Start.Date])),
'BAT VwRptMspAssignment'[EoaReason]="Successful Completion"),
'BAT VwRptMspAssignment'[FinishFlag])
但这些解决方案均无效。
有谁知道为什么或我还能尝试什么来实现这一目标?数据格式示例,导出为Excel:
"Contractors Available.2"是计算出来的列。
请注意第一行中的 521。如果我在 Excel 中应用所有这些过滤器,它应该为零,这个职位在数据集中是唯一的。它说 107 "Technical Writer - Expert" 行应该在 2017 年 9 月 26 日的一个月内结束,但这些是数据集中仅有的 3 位技术作家,其他两人中有零人在 9 月 30 日的一个月内结束了他们的任务/2016:
对计算列尝试这样的操作:
Contractors Available.1 =
VAR StartDate = 'BAT VwRptMspAssignment'[Start.Date]
VAR JobTitle = 'BAT VwRptMspAssignment'[JobPostingTitle.1]
RETURN
COUNTROWS (
FILTER (
'BAT VwRptMspAssignment',
'BAT VwRptMspAssignment'[End.Date] < StartDate + 31
&& 'BAT VwRptMspAssignment'[End.Date] > StartDate - 31
&& 'BAT VwRptMspAssignment'[Start.Date] < StartDate
&& 'BAT VwRptMspAssignment'[EoaReason] = "Successful Completion"
&& 'BAT VwRptMspAssignment'[JobPostingTitle.1] = JobTitle
)
)
EARLIER 函数不是必需的,因为变量将保留定义它们的上下文,即行上下文。
编辑: 我用您提供的数据测试了我的公式,它似乎有效。我更改了第二行中的 [End.Date],以在第一行中获得结果。