四则运算符错误
第二种错误类型是运算错误。例如除以0或者开负数的根号。他们不属于转换类的错误。这种错误在您调用一个函数并提供不正确的值的时候出现。
除0错误需要特别的注意,因为通常这个不容易被发现。当你除以一个0的时候,DAX就会返回一个特别的值‘Infinity’。
另外,在特殊的条件下,0/0或者 Infinity / Infinity 那么DAX返回一个特殊的字符 NaN
总结下,就是下图这样4种情况:
值得注意的是DAX中Infinity和NaN是特殊的值,不是错误。如果你把一个值除以Infinity,那么不会返回一个错误,而是返回0。
除了以上这些情况,当函数内使用错误的参数导致的运算错误,DAX返回报错。例如对负数开平方。
SQRT ( -1 ) = An argument of function 'SQRT' has the wrong data type
or the result is too large or too small
如果DAX发现了错误,那么计算引擎就会取消剩下的计算过程然后报错。可以使用函数ISERROR来检测表达式是否导致错误,这个具体的我们后面会讲。
最后,要强调一下这些值例如NaN只是在Power Pivot 或者Visual Studio中展示,它们在一些其他客户端可能会显示为错误值,例如在Excel Pivot中。这些值可以用于检测错误的函数发现。
空值或者缺失值
我们检测的第三个类型,不是一种错误值。它是空值,空值和其他其他元素一起参与计算的时候,会导致难以预期的结果或者报错。所以我们要了解DAX是如何处理这些值的。
DAX对缺失值,空值,或者空的单元格采用同样的处理方式,即使用BLANK。BLANK不是一个实际的数字,但是是DAX处理这些情况的一种识别方式。可以使用BLANK()来在生成BLANK,它不是空值。例如下面的表达式返回一个blank值,这些值在透视表中显示为空值。
= BLANK ()
函数本身,并没有多大的实际意义。但是blank函数在你需要返回一个空值的时候非常有用。例如。例如您先显示空值而不是0,例如下面的表达式,计算销售记录的总的打折情况,对打折为0的显示为blank。
= IF ( Sales[DiscountPerc] = 0, BLANK (), Sales[DiscountPerc]
* Sales[Amount] )
blank本身,不是错误,而是空值。因此,因此包含blank的表达式返回一个值或者blank,取决于计算的需求。例如,下面的表达式,当 Sales[Amount]是BLANK的时候,返回blank
= 10 * Sales[Amount]
换句话说,也就是当乘法的时候,其中一个或者两个都是blank时候,结果就是blank。其他的计算情况下,可以参考下面的例子:
BLANK () + BLANK () = BLANK ()
10 * BLANK () = BLANK ()
BLANK () / 3 = BLANK ()
BLANK () / BLANK () = BLANK ()
BLANK () || BLANK () = FALSE
BLANK () && BLANK () = FALSE
BLANK () = BLANK () = TRUE
但是BLANK结果不总是这样,计算的结果还依赖参与计算的其他参数。一些例子是加,减,除以BLANK,blank和值的逻辑运算。在下面的表达式中,可以看计算的条件以及计算的结果
BLANK () - 10 = -10
18 + BLANK () = 18
4 / BLANK () = Infinity
0 / BLANK () = NaN
FALSE || BLANK () = FALSE
FALSE && BLANK () = FALSE
TRUE || BLANK () = TRUE
TRUE && BLANK () = FALSE
Excel和SQL中的空值
Excel使用不同的方式来处理空值。Excel中,所有的空值被识别为0,无论是在求和或者乘法,但是在除法或者逻辑计算的时候,会返回错误。
SQL中,null值的处理方法和DAX中处理blank的方式不一样。从之前的例子看,DAX中,Blank的计算结果,不一定都是blank,而sql中null的计算,通常都是null。
正确理解空值和缺失值在DAX处理中的变化形式,以及在计算中使用blank()来返回空值,对你计算正确的结果,有非常大的帮助。通常情况下,当你可能发生错误或者返回错误的值时候,你可以使用blank在作为结果。