作为数据建模器,编写 DAX 可能引发计算时错误的表达式时,可以考虑使用两个有用的 DAX 函数。
- 该 ISERROR 函数采用单个表达式,并在该表达式导致错误时返回 TRUE 。
- 该 IFERROR 函数采用两个表达式。 如果第一个表达式导致错误,则返回第二个表达式的值。 事实上,这是一种将 ISERROR 函数嵌套在 IF 函数内的更优化实现。
但是,尽管这些函数非常有用,并且有助于编写易于理解的表达式,但它们也会显著降低计算的性能。 可能会发生这种情况,因为这些函数会增加所需的存储引擎扫描数。
大多数评估时间错误是由于意外的空白或零值或无效的数据类型转换而导致的。
建议
最好避免使用 ISERROR 和 IFERROR 函数。 相反,在开发模型和编写表达式时应用防御策略。 策略可以包括:
确保将质量数据加载到模型中: 使用 Power Query 转换删除或替换无效值或缺失值,并设置正确的数据类型。 当发生错误(如数据转换无效)时,还可以使用 Power Query 转换来筛选行。
还可以通过将模型列“可为空”属性设置为“关闭”来控制数据质量,这将导致在遇到空白时无法进行数据刷新。 如果发生此失败,则由于成功刷新而加载的数据将保留在表中。
IF使用函数:IF函数逻辑测试表达式可以确定是否会发生错误结果。 请注意,正如ISERROR和IFERROR的函数一样,此函数可能导致额外的存储引擎扫描,但它的性能可能会优于这两个函数,因为不需要引发错误。
使用容错函数: 某些 DAX 函数将测试和补偿错误条件。 这些函数允许你输入将返回的替代结果。 该 DIVIDE 函数就是一个这样的示例。 有关此函数的其他指南,请阅读 DAX: DIVIDE 函数与除法运算符(/) 一文。
示例:
以下度量值表达式测试是否会引发错误。 它在此实例中返回 BLANK (如果不向函数提供 IF value-if-false 表达式,则会出现这种情况)。
Profit Margin
= IF(ISERROR([Profit] / [Sales]))
此下一版本的度量值表达式已通过使用 IFERROR 函数代替 IF 和 ISERROR 函数进行了改进。
Profit Margin
= IFERROR([Profit] / [Sales], BLANK())
但是,此度量值表达式的最终版本可实现相同的结果,但更高效、更优雅。
Profit Margin
= DIVIDE([Profit], [Sales])
相关内容
- 学习路径:在 Power BI Desktop 中使用 DAX
- 问题? 尝试咨询 Power BI 社区
- 有建议? 提出改进 Power BI 的想法