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,实际遇到的场景着实不多,不再一一赘述。
今天的分享就到这里,祝大家学习愉快,下次见。
