欢迎光临散文网 会员登陆 & 注册

PowerBI之DAX神功:答网友问05 返回表的迭代函数你应该注意什么?

2021-09-05 11:56 作者:孙兴华zz  | 我要投稿

说明:

关于《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


PowerBI之DAX神功:答网友问05 返回表的迭代函数你应该注意什么?的评论 (共 条)

分享到微博请遵守国家法律