【问题标题】:DAX - Calculating at the Line Level (SUMX) with Multiple FiltersDAX - 使用多个过滤器在线路级别 (SUMX) 进行计算
【发布时间】:2018-09-24 17:24:55
【问题描述】:

我想让 DAX 做的是:

  1. 查看 HR 数据表中的每一行。
  2. 确定员工(“员工 a”)的开始日期
  3. 应用以下过滤器总结表中其他员工的数量:
    一种。顺利完成任务
    湾。在开始日期 + 31 之前结束他们的任务
    C。在开始日期后结束他们的任务 - 31(也就是说,在员工 a 开始日期的一个月内)
    d。在员工 a 之前开始(不计入员工 a 或他们队列中的任何人)
    e.与雇员 a 具有相同的职位。

这实质上是用普通英语问一个问题“对于我的每个员工,有多少其他具有相同职位的员工在该员工开始工作的一个月内成功结束了他们的任务?”在 DAX 中基本上只是“如何将多个过滤条件应用于 SUMX 或 COUNTAX 度量/计算列?”

我已经尝试过的措施是:

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 个“技术作家 - 专家”行应该在 2017 年 9 月 26 日的一个月内结束,但这些是数据集中仅有的 3 名技术作家,另外两个中的零个在 9/9 的一个月内结束了他们的任务30/2016:

【问题讨论】:

  • 仅供参考,您可以使用 &amp;&amp; / || 作为逻辑 AND / OR 运算符,而不是嵌套一堆过滤器。 FILTER(Table, &lt;cond1&gt; &amp;&amp; &lt;cond2&gt;) 而不是 FILTER(FILTER(Table, &lt;cond1&gt;), &lt;cond2&gt;)
  • 谢谢亚历克西斯!当我在 Marco Vos 的答案中指定变量时,这适用于计算列,但问题在于多个列上的“EARLIER()”函数,这似乎只在我使用嵌套过滤器时才有效。而且我不能将行的值指定为度量中的变量,只能在计算的列版本中。

标签: powerbi dax powerpivot powerbi-desktop


【解决方案1】:

对计算列尝试这样的操作:

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],以便在第一行中获得结果。

【讨论】:

  • 只是为了澄清使用这个的人,这是一个计算的列还是度量?
  • 这实际上给了我与我的问题中的计算列完全相同的结果。这绝对是一个更干净的布局,但它仍然给我提供了真正不匹配的数字。我会在问题中澄清。
  • @jpford - 我用你的数据测试了我的公式,它似乎有效。见编辑。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-08-29
  • 1970-01-01
  • 2022-11-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-11
相关资源
最近更新 更多