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

Power BI之DAX神功:答网友问08 嵌套使用时间智能函数

2021-10-18 20:46 作者:孙兴华zz  | 我要投稿

一、网友提问

答:问题我给您讲,被踢群的事没有办法。建议您看一下林志颖、金城武、还有心如姐姐主演的电影《学校霸王》,他演的是学校,同时也映射了当时和未来的全球社会。最终告诉我们一个道理,只有自己强大,才会被尊重。

二、大多数时间智能日期函数第1参数可以使用只有日期列的表

表名:Sheet1

因为大多数时间智能日期函数第1参数是日期列,但是,也可以是一个只有日期列的表。如下图所示:表原本有两列,我们需要将日期列生成一个表

将一列变成一个表:首先应该想到的是VALUESDISTINCT函数

VALUES与DISTINCT函数的区别:

详见《DAX神功》第1卷第9回 基础表函数之VALUES与DISTINCT函数和空行 

以下三个度量值,结果是等价的:

年初至今1 = CALCULATE(SUM(Sheet1[销售]),DATESYTD('Sheet1'[日期])) 

年初至今2 = CALCULATE(SUM(Sheet1[销售]),DATESYTD(VALUES('Sheet1'[日期])))

年初至今3 = CALCULATE(SUM(Sheet1[销售]),DATESYTD(DISTINCT('Sheet1'[日期])))

如果我们想锁定2021年,我们之前的方法是:

年初至今1 = CALCULATE(CALCULATE(SUM(Sheet1[销售]),DATESYTD('Sheet1'[日期])),'Sheet1'[日期]>date(2020,12,31))

年初至今2 = CALCULATE(CALCULATE(SUM(Sheet1[销售]),DATESYTD(VALUES('Sheet1'[日期]))),'Sheet1'[日期]>date(2020,12,31))

年初至今3 = CALCULATE(CALCULATE(SUM(Sheet1[销售]),DATESYTD(DISTINCT('Sheet1'[日期]))),'Sheet1'[日期]>date(2020,12,31))

既然,时间智能函数第1参数可以是一张只有日期列的日期表,我们可以筛选这张表呀?而不用再去套上一个Calculate去筛选内层的calculate

详见《DAX神功》第1卷第18回 Calculate复杂的筛选条件  我证明的calculate嵌套也可以是从内向外计算

CALCULATETABLE函数:详见《火力全开》笔记04

语法:Calculatetable(表,筛选条件)

年初至今1 = CALCULATE(SUM(Sheet1[销售]),DATESYTD('Sheet1'[日期])) 

年初至今2 = CALCULATE(SUM(Sheet1[销售]),DATESYTD(CALCULATETABLE(VALUES('Sheet1'[日期]))))

年初至今3 = CALCULATE(SUM(Sheet1[销售]),DATESYTD(CALCULATETABLE(DISTINCT('Sheet1'[日期]))))

CALCULATETABLE单独摆看不出来有什么用处,它的意义在于筛选表:

例如:只看2021年

年初至今1 = CALCULATE(CALCULATE(SUM(Sheet1[销售]),DATESYTD('Sheet1'[日期])),'Sheet1'[日期] > date(2020,12,31)

年初至今2 = CALCULATE(SUM(Sheet1[销售]),DATESYTD(CALCULATETABLE(VALUES('Sheet1'[日期]),'Sheet1'[日期] > date(2020,12,31))))

年初至今3 = CALCULATE(SUM(Sheet1[销售]),DATESYTD(CALCULATETABLE(DISTINCT('Sheet1'[日期]),'Sheet1'[日期] > date(2020,12,31))))

三、其实时间智能日期函数也返回一张表

时间智能日期函数也返回一张表,同样可以做另一个时间智能日期函数的参数,这个问题我们在前面3节课中已经证明过了。

例如:Datesytd和Sameperiodlastyear函数

以下表为例:

表名:Sheet1

表1=DATESYTD('Sheet1'[日期]) 

表2 = SAMEPERIODLASTYEAR(DATESYTD('Sheet1'[日期])) 

Ps: 其实就等同于:根据本期找到同期

表3 = SAMEPERIODLASTYEAR('Sheet1'[日期]) 

表4 = DATESYTD(SAMEPERIODLASTYEAR('Sheet1'[日期])) 

Ps: 今年以前的全部数据中,获取年初至今就是今年的同期数据

所以,表2和表4做calculate的筛选器结果是相同的

同比1 = CALCULATE(SUM(Sheet1[销售]),SAMEPERIODLASTYEAR(DATESYTD('Sheet1'[日期])))

同比2 = CALCULATE(SUM(Sheet1[销售]),DATESYTD(SAMEPERIODLASTYEAR('Sheet1'[日期])))

四、还有一种更奇葩的嵌套

年初至今 = CALCULATE(SUM(Sheet1[销售]),DATESYTD('Sheet1'[日期]))

同比3 = CALCULATE([年初至今],SAMEPERIODLASTYEAR('Sheet1'[日期]))

Ps: 先得到年初至今,求年初至今的同期和我们直接求同期的结果是一样的

同比4 = CALCULATE([同比3],DATESYTD('Sheet1'[日期]))

Ps: 当你用同比3做计算器,年初至今做筛选条件时,同比1=同比3=同比4

总结:这些嵌套理解就可以了,实际工作中如果没有必要尽量不用,化繁为简才是王道。

劝:三思而后行!但是:相离莫相忘,且行且珍惜

《孙兴华讲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

Power BI之DAX神功:答网友问08 嵌套使用时间智能函数的评论 (共 条)

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