我想获取按项目编号分组的[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行中重复的每个项目的总数。那不是我想要的。我需要对此应用第二个过滤器。
请查看附件,附件的最后一列是所需的输出。
预先感谢您的建议。
答案 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"
)
CALCULATE
和FILTER
的文档可能对进一步说明有用:
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
包装器,并丢弃CALCULATE
和MAX
函数以获得更简单的计算列。在这两种情况下,此变量版本都可能是性能更高的版本,因为ALLEXCEPT
函数已被优化以在CALCULATE
中有效地工作,而不必在使用FILTER
时实例化新表。
有关累计总数的更多详细信息,我建议使用DAX模式作为资源: