DAX 数据类型及 DAX 表达式中的常见错误

DAX可以使用不同的数值类型执行计算,其中有七种数据类型,如下:

数据类型 说明
整型 Whole Number(Integer) DAX只有一个可以存储64位值的Interger数据类型,DAX种整数值之间所有内部计算也使用64位值。
浮点型 Decimal Number(Float) 十进制数总是以双精度浮点值的形式存储,不要将此DAX数据类型与Transact-SQL的小数和数值数据类型混淆:SQL中DAX小数对应的数据类型是Float。
货币型 Currency(Currency) 一个固定的十进制数字,内部存储为整数。它可以表示四个小数点,内部存储为64位整数值除以10,000。在“货币”数据类型之间执行的所有计算总是忽略小数点后第四位的小数。货币型默认格式包括货币符号,还可以对整数和十进制数应用货币格式色黄之,也可以对“货币”数据类型使用不带货币符号的格式。
日期类型 Date(DateTime) DAX以DateTimeDax以DateTime数据类型存储日期。该格式在内部使用一个浮点数,其中整数对应自1899年12月30日以来的天数,而小数部分标识当天的分数。小时、分钟和秒被转换为一天的小数部分。如 =NOW () + 1返回当前日期加一天(正好24小时),其结果计算的是明天日期的同一时间。如果您只需要获取DateTime的日期部分,那么请始终记住使用TRUNC删除小数部分。注意:Lotus1-2-3是1983年发布的一个流行的电子表格,在处理DateTime数据类型方面有一个bug。它认为1900年是闰年,当时,Excel第一个版本的开发团队故意复制了这个bug,以保持与Lotus1-2-3的兼容性。从那时起,每个新版本的Excel都将这个bug作为一个特性来维护,因为它们具有兼容性。现在,这个bug仍然存在于DAX中,是为Excel向下兼容引入的。Bug的出现(或者我们应该称之为特性)可能会导致1900年3月1日以前的期间出现错误。因此,按照这个思路,DAX支持的第一个官方日期是1900年3月1日。在该日期之前的期间执行的日期计算可能导致错误,应被视为不准确。如果需要在1900年之前执行计算,应该使用公式将日期移到1900年之后,执行计算,然后将日期再移回到过去。
布尔类型 Boolean(TRUE/FALSE) 布尔数据类型内部存储也是数字,其中TRUE=1,FALSE=0。这对排序也会有用,TRUE > FALSE。
文本类型 Text(String) DAX中的每个字符串都存储为Unicode字符串,每个字符以16位存储。默认情况下,字符串之间的比较不区分大小写,因此:"PowerPivot"和"POWER PIVOT"两个字符串被认为是相等的。
二进制 Binary large object(BLOB) Blob数据类型用于数据模型中存储图像,在DAX中无法访问它。它主要被PowerView或其他客户端工具中用来显示直接存储在数据模型中的图片。(如Power BI可以使用在PowerQuery中使用"data:image/jpeg;base64,"&Binary.ToText([Content]) 去转换图片从而在Power BI中展示。

虽然DAX在运算的时候公式结果取决于表达式种所用的术语类型,但是要知道的是DAX会有运算符重载,其结果取决于运算符的符号而非源列,这个是按照运算符的要求所作的转换。举个例子:
="10"+32
这个是一个文本类型和一个数字类型的求和,结果没有报错的原因就是运算符重载。

file

上边是两个常量的计算结果,如果换成一个文本类型的列呢?

file

以上可以看到换成一个文本类型的列也没有报错,而要注意的Power Query中的M语言相关函数所需要的字段必须是参数要求的数据类型,没有运算符重载,如下:

file

如果DAX无法将某些内容转换为适合运算符需要的内容,则会发生转换错误(Conversion errors)。如下图所示:

file

文本类型"1+1"无法转换为Number类型。
为了避免这些错误,您需要在DAX表达式中添加错误检测逻辑,以拦截错误条件并总是返回有意义的结果。
以上的例子时转换错误,还有一种错误是算术运算错误(Arithmetical operations errors),如下图:

file

上图所示的例子就是,当有一个被0除的除法时,DAX通常返回特殊值Infinity/Nan,这种情况我们会用DIVIDE来拦截错误。

file

DIVIDE是一个安全函数,它执行除法运算,第三个参数是指被零除而导致错误时返回的值。 如果没有提供,则默认值为 BLANK()。
还有一种常见情况如下:

file

如果DAX检测到这样的错误,它将阻止对表达式的任何进一步计算并引发错误。您可以使用ISRROR函数检查表达式是否导致错误,或者使用IFEEOR来定义发生错误时的返回值。

注意: 如果考虑DAX性能的情况下,要尽量避免使用错误处理函数。因为当发生错误时,DAX引擎无法在其代码中使用优化的路径。所以在大多数情况下,检查可能的错误操作数比使用错误处理引擎更有效,我们可以使用IF来判断要求的值是否满足条件,然后定义返回值。

第三种在DAX表达式中的错误为空值或缺失值(Empty or missing values)。BLANK不是一个真正的值,而是一种识别这些条件的特殊方法。可以通过调用BLANK函数来获取DAX表达式中的值BLANK,该函数与空字符串不同。
例如,下面的表达式总是返回一个空白值,该值将显示为pivot表中的一个空单元格:
= BLANK ()
这个表达式本身是无用的,但是每当您想返回一个空值时,BLANK函数本身就变得有用了。例如,您可能希望显示一个空单元格而不是0,如下表达式计算销售额,如果销售额为0,则保留单元格为空:

度量值 = IF([销售额]=0,BLANK(),[销售额])

BLANK本身不是一个错误,而是一个空值。因此,包含BLANK的表达式可能返回值或空白,具体取决于所需的计算。BLANK在表达式结果中的传播并不是对所有公式都发生的。有些计算不传播BLANK,而是根据公式的其他项返回一个值。如下:

file

小结如下:

file

欢迎文下留言噢!

file



* PowerPivot工坊原创文章,转载请注明出处!


如果您想深入学习微软Power BI,欢迎登录网易云课堂试听学习我们的“从Excel到Power BI数据分析可视化”系列课程。或者关注我们的公众号(PowerPivot工坊)后猛戳”在线学习”。


长按下方二维码关注“Power Pivot工坊”获取更多微软Power BI、PowerPivot相关文章、资讯,欢迎小伙伴儿们转发分享~

Power Pivot工坊