DAX基础 — ISBLANK VS BLANK
好久没更新了,今天来分享下两个很简单却很容易犯错的函数,ISBLANK和BLANK。
先来看语法
函数 | 语法 | 返回值 |
ISBLANK | ISBLANK ( <Value> ) | 值为空则返回True,反之False |
BLANK | BLANK ( ) | 任何类型的值 |
表面上看两个函数只有有无参数的区别,实际上是这样吗?
打开Dax studio,先来看一组结果,从结果上看是相同的,这也是为什么很多人会误以为它们是一样的。
接下来看下面的例子,这时会发现结果很能和我们先前想的不一样了,ISBLANK将0和空字符判定为了False,而BLANK会认为它们是True,除非使用==。
这时我们再来总结一下,
-
ISBLANK( <VALUE> ) 等效于 <value> == BLANK()
-
ISBLANK认为0和空字符串并不为空
接下来在实际报表中来应用下上面的知识,先创建几个基础度量
Sales Amount = SUM( 'FactInternetSales'[SalesAmount])
LM.Sales Amount =
CALCULATE( [Sales Amount], DATEADD( 'DimDate'[FullDateAlternateKey], -1, MONTH))
MOM%.Sales Amount =
DIVIDE( [Sales Amount] - [LM.Sales Amount], [LM.Sales Amount]
)
表格中有两行的结果我们需要注意
-
2011年1月的上期为空,即分母为空,所以结果也为空
-
2014年3月本期为空,即分子为空,所以结果为-100%
接下来换另一种写法,从数学上讲(A-B)/B 是等价于 A/B – 1的,所以我们这样写同比
MOM%.Sales Amount 2 =
DIVIDE( [Sales Amount], [LM.Sales Amount] ) - 1
造成这个结果的原因是在加减法中BLANK会自动转换为0,0-1肯定是-1无疑了。所以为了让未发生的日期不显示负值,通常会做下判断
MOM%.Sales Amount 3 =
IF(
NOT ISBLANK( [Sales Amount] ),
DIVIDE( [Sales Amount] - [LM.Sales Amount], [LM.Sales Amount] ))
接下来再看另外一个例子,假设我们想统计产品数量
Products =
COUNTROWS ( 'DimProduct' )
Product 2 =
COUNTROWS ( VALUES ( 'DimProduct' ) )
结果一样,也没什么问题,那么接下来,回去PQ页面,过滤到Product表中的Color为Black的数据,再来看结果
结果不再相同,如果我们是求不同颜色的产品占所有产品的占比,那这里得到的结果也会不同。这里其实涉及到了一个概念,DAX中使用的表是扩展表。也就是说虽然我们删除了产品表中Color为Black的产品,但是Sales表是有这些产品的销售记录的,它们无法和现在的Product表的中记录相匹配,就会返回空,这也是很多时候我们会发现日期切片器有空白项的原因,事实表中的有无法和维度表匹配的记录。
每一个DAX函数看起来都很简单,但是当这些简单的DAX组合起来用时,也许会产生让我们难以理解的结果,这在写一些复杂地度量值是需要额外注意。
扩展阅读
How to handle BLANK in DAX measures – SQLBI
Handling BLANK in DAX – SQLBI
本篇文章来源于微信公众号: PowerBI木小桼