PowerBI之DAX神功:答网友问05 返回表的迭代函数你应该注意什么?
说明:
关于《The Definitive Guide to DAX》中介绍的CONCATENATEX函数
在《孙兴华讲PowerBI火力全开》笔记25课03和04中做了详细讲解,并举有案例
前景回顾:
在《DAX神功》答网友问04中

提问网友的需求:获取每个月份最大销售金额及产生最大金额的销售日期
度量值如下:
销售金额 = sumx('销售表',RELATED('商品表'[售价])*'销售表'[销量])
销售峰值3 = maxx('日期表',[销售金额])
发生日期 =
var x=maxx('日期表',[销售金额])
var tb=FILTER(VALUES('日期表'[日期]),[销售金额]=x)
return
IF(COUNTROWS(tb)=1,tb,BLANK())
Ps: 度量值【发生日期】写法可不只这一种哦,详见上节课。
正片开始:
《孙兴华讲PowerBI火力全开》第26课用了16分钟的时间讲了两个函数,分别是:
ADDCOLUMNS与SELECTCOLUMNS
关于这两个函数的语法及案例,详见《孙兴华讲PowerBI火力全开》第26课
ADDCOLUMNS是在指定表中增加一列或多列:

SELECTCOLUMNS是在指定表中选择一列或多列:

还是《DAX神功》答网友问04的案例:

我们换一种思路,求销售锋值发生的日期:
第一步:我们计算销售金额,再写一个销售峰值3度量值备用
【度量值】销售金额 = sumx('销售表',RELATED('商品表'[售价])*'销售表'[销量])
【度量值】销售峰值3 = maxx('日期表',[销售金额])
第二步:我们通过添加列,将销售金额新增到日期表中
【新建表】表1 = ADDCOLUMNS(VALUES('日期表'[日期]),"销售金额",[销售金额])

第三步:筛选表1中最大金额的
【新建表】表2 = FILTER('表1','表1'[销售金额]=maxx('表1',[销售金额]))

第四步:我们要取标量值,所以选择表2中的日期列(相当于取一个单元格)
【新建表】表3 = SELECTCOLUMNS('表2',"日期",'表2'[日期])

第五步:综合以上公式写成VAR形式的度量值
峰值日期1 =
var tb1=ADDCOLUMNS(VALUES('日期表'[日期]),"销售金额",[销售金额])
var x= [销售峰值3]
return
SELECTCOLUMNS(
FILTER(tb1,[销售金额]= x),"日期",'日期表'[日期])
Ps: 虽然返回的是一张表,但是这个表只有一行一列,可以以标量值输出。

当然,这个公式只是在理想状态下的,如果使用Filter筛选tb1时,当最大销售金额日期不只一个(假设1月份最大销售金额有3天都是并列第一),那就会报错了。详见《DAX神功》第1卷第10回
第六步:我们通过《DAX神功》答网友问04,将度量值公式写成:
峰值日期1 =
var tb1=ADDCOLUMNS(VALUES('日期表'[日期]),"销售金额",[销售金额])
var x= [销售峰值3]
var tb2=SELECTCOLUMNS(
FILTER(tb1,[销售金额]= x),"日期",'日期表'[日期])
return
if(COUNTROWS(tb2)=1,tb2,BLANK())
还可以写成:(Ps:其实本人就习惯这种写法,原理在上节课已做了详细说明)
峰值日期1 =
var tb1=ADDCOLUMNS(VALUES('日期表'[日期]),"销售金额",[销售金额])
var tb2=SELECTCOLUMNS(
FILTER(tb1,[销售金额]= MAXX(tb1,[销售金额])),"日期",'日期表'[日期])
return
if(COUNTROWS(tb2)=1,tb2,BLANK())

网友疑问:
为什么公式写成下面这样,就报错了呢?
锋值日期2 =
var tb1=SELECTCOLUMNS('日期表',"日期",'日期表'[日期],"销售金额",[销售金额])
var tb2=SELECTCOLUMNS(
FILTER(tb1,[销售金额]= MAXX(tb1,[销售金额])),"日期",'日期表'[日期])
return
if(COUNTROWS(tb2)=1,tb2,BLANK())
网友不理解的地方:
【新建表】表4=SELECTCOLUMNS('日期表',"日期",'日期表'[日期],"销售金额",[销售金额])

与使用ADDCOLUMNS时的结果一样呀?我就换了一个函数,就报错了?

这里大家要特别注意:虽然二者在显示结果上一样,但是本质变了。
ADDCOLUMNS相当于整容,例如你长了两只眼睛,整容可以让你变成3只,但你还是你。
SELECTCOLUMNS相当于克隆再整容,克隆你再整容成3只眼,长的一样,但是那不是你。

总结:出错原因就是你的tb1已经不是日期表了,但是它不影响筛选最大销售金额。可是当你使用Selectcolumns选择列时,你无法选择日期表中的某个列,因为那张tb1是克隆表。

《孙兴华讲PowerBI火力全开》PowerBI必学课程
https://www.bilibili.com/video/BV1qa4y1H7wp
《DAX神功》文字版合集:
https://www.bilibili.com/read/readlist/rl442274
《DAX神功》视频版合集:
https://www.bilibili.com/video/BV1YE411E7p3
PowerBI(DAX函数)、PowerQuery(M函数)、Python办公自动化、Python爬虫、Python数据分析、ExcelVBA、WordVBA、AccessVBA、MySQL等等
https://www.bilibili.com/read/cv10222110