首页 > 解决方案 > 为计算列循环工作 DAX 函数

问题描述

我有一个函数将查看“项目提交上限”列中的空字段,并查找具有相同 ID 和下一个较早日期的值,并为“项目提交上限 NoNulls”列提供该值。DAX 不会递归地执行此操作,因此如果连续有 2 个空值,我会得到一个空白。在另一种语言中,一个简单的 while 循环 ( while value is null do: XYZ) 可以解决这个问题,但 DAX 不支持 For/While 循环吗?

如何让工作的 DAX 函数应用填充的值并继续运行,直到没有更多的空值?

可选地,我如何强制它运行 X 次(可能是 10 次)?这不是一个很好的解决方案,但会完成工作

下面的示例表被过滤以仅显示一个 2 个 ID,不同 ID 的记录在此处显示的记录之间,因此我无法执行类似 excel 的功能“从下面的行中获取值”

现在做什么

这是将填充先前值的 DAX 函数(如上图所示):

ProjectCommitCap_NoNulls =
IF (
    ISBLANK ( 'Project Story Data'[Projected Commitments Cap] ),
    LOOKUPVALUE (
        'Project Story Data'[Projected Commitments Cap],
        'Project Story Data'[ID], 'Project Story Data'[ID],
        'Project Story Data'[Date of Data], CALCULATE (
            MAX ( 'Project Story Data'[Date of Data] ),
            FILTER (
                'Project Story Data',
                'Project Story Data'[ID] = EARLIER ( 'Project Story Data'[ID] )
                    && 'Project Story Data'[Date of Data]
                        < EARLIER ( 'Project Story Data'[Date of Data] )
            )
        )
    ),
    'Project Story Data'[Projected Commitments Cap]
)

我需要看起来像这样(要填写 NoNulls 中的所有值):

我希望它看起来像什么

标签: loopspowerbidax

解决方案


DAX 根本不做循环,但我认为您可以修改公式以查找最后一个非空白日期,而不仅仅是前一个日期。

ProjectCommitCap_NoNulls =
IF (
    ISBLANK ( 'Project Story Data'[Projected Commitments Cap] ),
    LOOKUPVALUE (
        'Project Story Data'[Projected Commitments Cap],
        'Project Story Data'[ID], 'Project Story Data'[ID],
        'Project Story Data'[Date of Data], CALCULATE (
            MAX ( 'Project Story Data'[Date of Data] ),
            FILTER (
                'Project Story Data',
                'Project Story Data'[ID] = EARLIER ( 'Project Story Data'[ID] )
                    && NOT ( ISBLANK ( 'Project Story Data'[Projected Commitments Cap] ) )
                    && 'Project Story Data'[Date of Data]
                        < EARLIER ( 'Project Story Data'[Date of Data] )
            )
        )
    ),
    'Project Story Data'[Projected Commitments Cap]
)


正如@greggyb 指出的那样,在查询编辑器中使用“填充”转换是一个更简单的解决方案。

继续使用 DAX,您可能会发现此问答也很有用: 返回由另一列排序的最高值


推荐阅读