- 1 -
在Power Query里,如果遇到空值(null),就要注意对其进行操作(对比判断、筛选、计算等)时可能出现的特殊情形。
比如,我们有这么一份数据,期初、收入、支出等项里,都存在空的项,实际上无论是从Excel还是数据库导入时,这些空的内容都会被识别为null:
这时,如果我们直接用加减的方式进行处理(求结存数 = 期初 收入-支出),得到的结果会有很多null,很可能就不是我们所希望的:
- 2 -
对于这种有null参与加减运算的情况,处理的方法非常多,最基础的,可以直接将null值替换为0,然后再进行加减计算:
这时,当然就可以得到我们想要的结果:
但是,很多时候,我们并不建议在Power Query里直接将null替换为0,而是保留为null,这样对后续的数据建模和分析其实更加有利——这一点我们后面再撰文举例说明。
那如果我们不将null替换为0,该怎么进行计算呢?我们很容易想到的一种方式是,通过判断替换,即如果某个值是null,那么就先转为0,再相加,具体如下图所示:
上面的判断写法显得直接,但是,显然会显得比较重复、笨拙!既然对每一个值都是进行同样的判断转换,那不是可以统一写一个自定义函数吗?具体如下图所示:
对于在添加自定义列里使用let ... in ...结构,可能很多朋友比较陌生,实际上,这个结构不仅是大家看到的在高级编辑器里作为查询步骤的管理和输出,它本身就像if...then...else...或try...otherwise...等一样,关键在于它输出什么内容,只要它输出的内容符合调用它的函数的要求就可以了。
对于这一点,新手要多体会。尤其在遇到某些需要重复调用的数据、临时写个自定义函数来使用时,let ... in ... 的写法非常方便、高效!
- 3 -
除了直接的替换、简单却繁琐的条件判断,其实还有一个“捷径”——List.Sum函数。
比如说,当我们用List.Sum对一个包含null值的列表进行求和时,我们并不需要对null进行特别的处理,就能得到正确的结果:
但是,这里是不是将null转换为0了呢?我们继续用上面的例子来看一下——我们在期初、收入、支出上都转成列表({})然后套一个List.Sum,如下图所示:
显然,这个结果并不是我们想要的,因为如果某个值为null,它的结果仍然为null,也就是说,对于null,List.Sum并不是将它转换为0,而是忽略它不进行计算,但是,当这个列表只有一个null值时,List.Sum的结果仍然是null,如下图所示:
那说好的“捷径”呢?其实,比较简单,我们在对某些值转为列表使用List.Sum时,可以加多一个0值,这样,我们就能实现类似前面if [xx]=null then 0 else [xx] 的效果,如下图所示:
最后,再回到这个问题最初的需求,有了前面List.Sum和0结合的这种用法,我们就可以得到一个更加简单点儿“算法”:合并要加的项,一次性求和,合并要减的项,一次求和,然后总加项减去总减项:
当然,要记得添加0再List.Sum哦!