如何在DAX中应用带有两个过滤器的Calculate函数以获取运行总和

时间:2019-04-23 21:06:37

标签: excel dax

我想获取按项目编号分组的[Days Past Due]列的运行总和,对于每个项目编号,请获取每个阶段/结束日期的值。 在SQL中,我会这样做:

SELECT   Project_number
         ,phase
         ,Sum(Days Past Due) RunningTotal
FROM     Table

GROUP BY Project_number
         ,phase
ORDER BY Project_number
         ,phase

请在DAX中做类似的事情。

我尝试:

CALCULATE (
    SUM ( DataSource[Days Past Due] ),
    ALLEXCEPT ( DataSource, DataSource[Project Number] )
)

它为我提供了在4行中重复的每个项目的总数。那不是我想要的。我需要对此应用第二个过滤器。

请查看附件,附件的最后一列是所需的输出。

预先感谢您的建议。

enter image description here

1 个答案:

答案 0 :(得分:1)

您可以这样调整自己的尝试:

Cumulative Days Past Due = 
CALCULATE(
    SUM( DataSource[Days Past Due] ),
    FILTER(
        ALLEXCEPT( DataSource, DataSource[Project Number] ),
        DataSource[End Date] <= MAX( DataSource[End Date] )
    )
)

请注意,您可以通过将更多条件与FILTER结合起来,在&&函数中包括更多过滤条件。您也可以在CALCULATE中添加更多过滤条件。这是一个示例:

Cumulative Days Past Due = 
CALCULATE(
    SUM( DataSource[Days Past Due] ),
    FILTER(
        ALLEXCEPT( DataSource, DataSource[Project Number] ),
        DataSource[End Date] <= MAX( DataSource[End Date] )
            && DataSource[Start Date] > DATE( 2018, 12, 31 )
    ),
    DataSource[Phase] = "Scope"
)

CALCULATEFILTER的文档可能对进一步说明有用:

https://dax.guide/calculate/
https://docs.microsoft.com/en-us/dax/calculate-function-dax

https://dax.guide/filter/
https://docs.microsoft.com/en-us/dax/filter-function-dax


如果您尝试在计算列中写入此公式,则该公式将无法正常工作,您将需要使用EARLIER而不是MAX

Cumulative Days Past Due = 
CALCULATE(
    SUM( DataSource[Days Past Due] ),
    FILTER(
        ALLEXCEPT( DataSource, DataSource[Project Number] ),
        DataSource[End Date] <= EARLIER( DataSource[End Date] )
    )
)

这样做的原因是,在度量MAX中是在其本地过滤器上下文中计算的,但是在计算列中,上下文是不同的,并且您使用EARLIER来引用较早的行上下文,是,较大表(而不是较小的End Date表)的当前行中的FILTER

如果您想要某种可以用作度量或计算列的东西,那么@RADO的解决方案非常接近,您可以编写以下代码:

Cumulative Days Past Due =
VAR CurrDate =
    CALCULATE( MAX( DataSource[Start Date] ) )
RETURN
    CALCULATE(
        SUM( DataSource[Days Past Due] ),
        ALLEXCEPT( DataSource, DataSource[Project Number] ),
        DataSource[End Date] <= CurrDate
    )

在此版本中,MAX的工作方式与上述第一个版本中的工作相同,它也应以计算得出的方式工作,因为将MAX包裹在CALCULATE中会执行上下文转换,将行上下文转换为与该单行相对应的过滤器上下文。

您可以仅拖放一个度量CALCULATE包装器,并丢弃CALCULATEMAX函数以获得更简单的计算列。在这两种情况下,此变量版本都可能是性能更高的版本,因为ALLEXCEPT函数已被优化以在CALCULATE中有效地工作,而不必在使用FILTER时实例化新表。


有关累计总数的更多详细信息,我建议使用DAX模式作为资源:

https://www.daxpatterns.com/cumulative-total/