《孙兴华讲PowerBI火力全开版》
很多人DAX公式错误都是:咎由自取!因为他已经惯了Excel里乱七八糟的写法,Apple Music订阅用户将享受到幅提升的古典音乐欣赏体验。Apple Music未来几个月内,接下来我们就挨个的讲一讲,Apple Music古典乐迷将享受到Primephonic出色功能的专属体验,如果你是从正规数据库上获取的数据,包括更强的按作曲家和曲目浏览与搜索功能、详实的古典音乐背景信息,可能多数问题你都遇不到。一、文本与数值根据《孙兴华讲PowerBI火力全开》笔记第1集 运算符
数值加数值 = [数值]+[数值] // 520 + 1314 = 1834
文本加数值 = [字符]+[数值] // "520" + 1314 = 1834
文本加文本 = [字符]+[字符] // "520" + "1314" = 1834
数值连接数值 = [数值] & [数值] // 520 & 1314 = "5201314"
文本连接数值 = [字符] & [数值] // "520" & 1314 = "5201314"
文本连接文本 = [字符] & [字符] // "520" & "1314" = "5201314"
你会发现规律:
使用“+”时,以及多项新功能与优势。据了解,他会将字符自动转化成数值进行计算
使用“&”时,Apple Music还计划在明年发布一款专属的古典音乐app。这款应用会保留Primephonic备受乐迷喜爱的经典用户界面,他会将数值自动转化成文本进行计算
你真的认为它永远都能转换吗?例如:"1"不等于1,并将加入更多新增功能。另外,"520"于1314
因为:"1"=49 而 :1 = 1
因为:"520"=53 而:1314=1314
因为ASCII码?不!你这是,Primephonic现有订阅用户将免费获取6个月Apple Music订阅服务,Excel逻辑,以无损和高解析度音频畅听数以十万计的古典音乐专辑,在PowerBI的DAX中,还可通过空间音频欣赏数百张古典音乐专辑。举报/反馈,文本与数值就无法进行比较运算。DAX会报错,会提示你:
DAX比较操作不支持将类型为Text的值和类型为Integer的值进行比较,请考虑使用Value或Format函数转换其中一个值。
可以使用《孙兴华讲PowerBI火力全开》笔记第17课转换函数 VALUE【将文本转数值】
Value("520")
所以建议家无论何时何地,都不要让DAX自己转换数据类型,你要检查每个字段的数据类型是否正确,如果你的表导入时,这一列都是数值,那PowerBI会自动识别为数值,就是因为多数人我行我素(如图1-4-1)。造成后期麻烦不断。
规避方法:谁在这样输入数据,我们就让他来分析:)
图1-4-1
刚才我们遇到的“520”或者“1”都是文本型的数字,但是遇到(图1-4-1)这种情况你怎么办呢?这就引出了我们第二个概念:
二、如何正确的规避错误
如图1-4-2,因为销售数量是文本型,单价是数值型,我们直接【新建列】计算,会报错!
图1-4-2
《孙兴华讲PowerBI火力全开》笔记第12课.IFERROR 遇到错误时使用指定数值替换
如图1-4-3,我们可以使用IFERROR函数判断发生错误时,返回空。这也是推荐的方法!
图1-4-3
图1-4-4,也可以使用同样的函数,将错误返回成指定数值。
图1-4-4
图1-4-5,但是,不能将错误转化成文本。
图1-4-5
为什么不能将错误写成中文或英文?
因为销售金额这一列在计算过程中,数据类型已经变成了数值
而当初导入Excel文件时,销售数量这列是文本型,你看都靠左,而单价这列是数值型都靠右
因为销售数量那一列有一个孙兴华,所以就自动使用了文本型(即可以存数值又可以存文本)
如果你想强行转换结果的类型,也没有问题,但是这属于胡闹,用办公软件的人有两个最严重的胡闹
1. 非打印表格使用合并单元格或多表头,胡闹指数100%2. 数据类型混乱,同一字段各种类型胡写,胡闹指数100%三、为何推荐将错误、空值、缺失值转化为BLANK()
在DAX中,通常缺失值,空值都使用BLANK()处理
科普:
缺失值包含空值(null)、0、False等
null值是空值,是缺失值的一种
你心里应该非常清楚,如果(图1-4-5)的结果对错误的返回值写了中文或英文,再次计算时仍然要规避下一个错误,那为何你还要这样做呢?
强行写也不是不可以,但是无意义,还添乱:如图1-4-6
《孙兴华讲PowerBI火力全开》笔记第17课.转换函数 CONVERT函数【转换为指定数据类型】
销售金额 = IFERROR(CONVERT([销售数量]*[单价],STRING),"这是错的")
图1-4-6
现在如你所愿”销售金额“这一列变成了文本型
你现在写一个度量值,并将它放到矩阵中,会有什么结果?如图1-4-7
总金额 = sum(Sheet1[销售金额])
图1-4-7
原理:IFERROR之所以遇到错误时使用指定数值替换,因为你在计算,计算结果本身就是数值,所以必须用数值,这是数据类型的统一性。
你说了一个谎就要去用另一个谎去圆
IFERROR(表达式,BLANK()或数值)
有些人会抬扛:如果我的表达式是&连接两个列,报错以后,是不是可以返回文本?可以!但是,如果你原始的两个列本身不是错误,你怎么可能连接出错误?
那么问题来了,为何推荐将错误转化为BLANK()?答:为了不再出错!
图1-4-8
销售金额 = IFERROR(CONVERT([销售数量]*[单价],STRING),"错了")
销售金额2 = IFERROR([销售数量]*[单价],BLANK())
销售金额*10 = [销售金额]*10
销售金额2*10 = [销售金额2]*10
我们再进行一个测试:
图1-4-9
销售数量2 = if([销售数量]="孙兴华",BLANK(),[销售数量])
空字符串 = [销售数量2]=""
销售金额 = IFERROR([销售数量]*[单价],BLANK())
0 = [销售金额]=0
如果这一列,是文本类型,那么,BLANK()就是空字符串
如果这一列,是数值类型,那么,BLANK()就是0
这个时候,数学逻辑好的人,就会举一反三,那么日期/时间型呢?因为他们本身也是数字类型的演化,所以同理数字。
但是要注意:并不是任何类型与BLANK()进行四则运算结果都是BLANK()
例如:
1+BLANK()=BLANK()
BLANK()+BLANK()=BLANK()
这只限定于加减乘除
PS: 经常会拿常识说我讲的内容不适合小白,例如他听不懂"唯一值"是什么?如果哪位听不懂四则运算是什么,只能证明你的小学是假的。
另外需要注意的是:日期类型的BLANK()+1 不等于BLANK()修证:在视频上我讲这里时忽略了日期类型,家要特别注意
但是:连接和比较运算就不一样了,你需要举一反三:
"孙兴华" & BLANK() = "孙兴华" //因为这个时候, BLANK()代表空字符串
520 & BLANK() = "520" //因为&的结果都是字符串,所以BLANK()代表空字符串
"孙兴华" > BLANK() //返回: True 因为这个时候, BLANK()代表空字符串
"" = BLANK() //返回: True 因为这个时候, BLANK()代表空字符串
1 > BLANK() = True //返回: True 因为这个时候, BLANK()代表0
0= BLANK() //返回: True 因为这个时候, BLANK()代表0
如果是逻辑判断呢?废话连篇!True和False是0和1
那你说: True && BLANK() 是什么? // 1 and 0 那不还是0吗?
我小时候打扑克牌,有一种玩法,就是谁拿到王小王(等同于BLANK()),可以用它们代替任何牌,可能地区不同我们的玩法不同,我们「塞伯坦星球」就是这么玩的。
例如,我手上有 3、4、6、7、9、10、J、Q、K、A
很明显,我若将手上顺子的9、10、J、Q、K、A出掉,手上的3、4、6、7就变成了单牌。如果小王在手,我可以这样出3、4、王、6、7、小王、9、10、J、Q、K、A
//王代替5,小王代替8
或3、4、小王、6、7、王、9、10、J、Q、K、A
//小王代替5,王代替8
四、IF与IFERROR的区别家都知道,分母为0时会报错,除非你用安全除法=IFERROR(5/0,BLANK())等同于= If(ISERROR(5/0),BLANK(),5/0)
《孙兴华讲PowerBI火力全开》笔记第12课 if条件判断
《孙兴华讲PowerBI火力全开》笔记第22课 信息函数中的ISERROR
=ISERROR(5/0) //返回:True ,功能判断5/0是不是一个错误
很明显,我们使用IFERROR更简单,但是现在的情况是:
如果5/0是个错误,我们就返回BLANK(),否则返回5/0的结果
现在我们换一道题,如果 '表'[列名] 是BLANK(),就怎么样,否则怎么样?
我们有IFERROR,但是没见过IFBLANK,然而我们有ISBLANK
《孙兴华讲PowerBI火力全开》笔记第22课 信息函数中 还有很多判断函数可供使用
图1-4-10
你知道"销售金额3"为什么报错吗?
因为:[销售数量2]*[单价] 返回数值型,而“哈哈它是空的”是个文本型
五、抛开速度,IFERROR与ISERROR最的弊端
图1-4-11
商1 =iferror([分子]/[分母],Blank())商2=if(iserror([分子]/[分母]),Blank(),[分子]/[分母])商3=if([分母]0,[分子]/[分母],Blank())商4=if([分母]0,[分子]/[分母],ERROR("分母不能为0"))
商1和商2需要先判断[分子]/[分母]是不是一个错误,理论上比商3慢,是因为多了一步判断。
但是,实际你不易感觉出来,就好比有些奇怪的人们对比照片和视频清晰度一样。
例如照片:它们将照片放放再放,对比锐度,焦外,二线性。
例如视频:他们将画面定住,然后趴在电视机前,看看演员的毛孔。
另一个问题才是最致命的,官方语言说:截获内层级别计算时发生的错误
图1-4-12
商1 = CALCULATE(sumx('Sheet2',iferror([分子]/[分母],Blank())))商2 = iferror(sumx('Sheet2',[分子]/[分母]),Blank())
IFERROR与ISERROR同理,官方语言也是很好理解,可即便是萌新小白
你也应该清楚,他的运算规则,是从内到外,你搞清楚运算规则,原理不攻而破。
六、ERROR函数测试未通过
首先声明,我并不是要黑谁和批判谁,这只是我在使用中发现的问题,和家分享一下,家可以自行测试,有问题可以提,互通有无。
图1-4-13 是某位DAX原理讲师,在知乎上引用《The Definitive Guide to DAX》原著中的内容:
图1-4-13
第1个 = IFERROR (
SQRT ( Test[Temperature] ),
)
这个度量值肯定是没问题的,但是第2个度量值就有问题了:
PowerBI 2021年6月版测试不通过
第2个 = IF (
Test[Temperature] >= 0,
SQRT ( Test[Temperature] ),
ERROR ( "The temperature cannot be a negative number. Calculation aborted." )
)
图1-4-14
处理方法:
错误提示 = IFERROR(CONVERT(SQRT(Test[Temperature]),STRING),"The temperature cannot be a negative number. Calculation aborted.")七、PowerBI中的DAX使用变量时不受版本影响Marco Russo和Alberto Ferrari 两位意利专家写的《The Definitive Guide to DAX》曾指出,使用变量时,会根据产品DAX版本不同,返回不同的结果亲测:2021年6月版的PowerBI不受影响
但是在PowerPivot中,可能就真的不一样了。PowerPivot内置在Excel中,Excel2016、2019、2021、365版本众多,365订阅尚且更新,其它版本…
2021年6月版的PowerBI中:以下三种写法,均正常返回结果
测试1=iferror(5/0,520)
// 先定义变量,输出时再做判断
测试2 =
varabc= 5/0
return
iferror(abc,520)
//先判断,再输出
测试3 =
iferror(
var abc=5/0
return
abc,
520
)
八、防抬扛:分母为零时计算报错可用安全除法
《孙兴华讲PowerBI火力全开》笔记第13课 安全除法
语法:DIVIDE(分子,分母,[替换结果])替换结果可以略不写,略时返回为空。除法 = [分子]/[分母]