DAX实战 | 空白数据(Null值)知多少

小伙伴们好啊,今天给大家说说DAX中的空白数据(Null值)。

有的小伙伴可能会有疑问:一个空白有啥好说的,难道还暗藏玄机吗。

别说,还真有。不信的话,和我来看下面的案例:

问题初探

以下是随机模拟的数据,需求是:计算【Pionts】字段为非空的行数。

有的小伙伴马上就有了思路:

<> BLANK =CALCULATE(COUNTROWS( Data ),Data[Points] <> BLANK())

这个答案是不是正确呢。眼见为实:

难道结果不应该是5吗?难道DAX连这么简单的东西都算错了吗?

DAX算错了吗

别着急下结论,一起来做一个简单的测试:

0 Equals Blank ? = 0 = BLANK()

得到的结果居然是TRUE()。

DAX并没有算错,在它看来,BLANK和0是相等的。

所以,对于刚才的公式,我们在筛选Data[Points] <> BLANK()的时候,也会把Points为0的行过滤掉。

同理,如果我们写的是Data[Points] <> 0,Points为BLANK()的行也会被过滤掉。

终于,我们找到了问题的原因,可是文章开头提到的问题还没有得到解决。那要怎么办。

BLANK和0真的是等价的吗?

要解决这个问题,我们必须把0和BLANK区分开来,于是我们很自然的就想到了这样的问题:BLANK和0是等价的吗?有没有函数可以区分它们呢?

0 Is Blank? = ISBLANK( 0 )

答案是ISBLANK,ISBLANK函数可以严格区分0和BLANK。

正如小伙伴们看到的,这次返回了FALSE。

至此,这个案例的解法已经呼之欲出:

NOT BLANK =CALCULATE(COUNTROWS( Data ),NOT ISBLANK( Data[Points] ))

小结

Null值或者Blank是一种非常特殊的值,在不同语言中,都有各自不同的处理方法。

在DAX中,当某一字段空白和0同时存在时,如果我们需要把0和空值区分对待后计算,就一定要多多留心这个问题。

其他关于BLANK的计算,诸如BLANK()-10=-10,0/BLANK()= NaN,4/BALNK() = Infinity,实际遇到的场景着实不多,不再一一赘述。

今天的分享就到这里,祝大家学习愉快,下次见。



经验分享 程序员 微信小程序 职场和发展