《孙兴华讲PowerBI火力全开》笔记 09.聚合函数与迭代函数 <2>迭代函数
讲述了,AverageX、MaxX、MinX、CountX、CountaX、ProductX...它们与Filter函数一样都是行上下文
语法:一张新表=Filter('表名', 筛选条件)
Filter函数: 不仅是表函数,还具有迭代功能(对表逐行扫描进行筛选),说白了就是限制表的行数用的
Filter函数的作用就是:
筛选表
例1:图1-7-1如果我只想看男生的数据,请你给我返回一张表
表 = FILTER('Sheet1','Sheet1'[性别]="男")
例2:如图1-7-1我们想多条件筛选,现在要筛选
一班
的
男生
表 = FILTER('Sheet1',
AND(
'Sheet1'[性别]="男",'Sheet1'[班级]="一班"
)
)
表 = FILTER('Sheet1',
'Sheet1'[性别]="男"
&&
'Sheet1'[班级]="一班"
)
例3:
如图1-7-1
我们使用三个条件筛选,现在要筛选一班,男生,80分
表 = FILTER('Sheet1',
AND(
A
N
D('Sheet1'[性别]="男",'Sheet1'[班级]="一班")
,
'Sheet1'[分数]=80)
)
表 = FILTER('Sheet1','
Sheet1'[性别]="男" && 'Sheet1'[班级]="一班" && 'Sheet1'[分数]=80
)
如果条件太多,这样的代码并不易读:
现在,我们参照语法,将它写成VAR形式:
一班男生 =
var tb1 = FILTER('Sheet1','Sheet1'[性别]="男")
return
FILTER(tb1,'Sheet1'[班级]="一班")
一班男生80分 =
var tb1 = FILTER('Sheet1','Sheet1'[性别]="男")
var tb2 =FILTER(tb1,'Sheet1'[班级]="一班")
return
FILTER(tb2,'Sheet1'[分数]=80)
这个嵌套很好理解,逻辑与绝大多数编程相同
变量a = 1
变量b = 变量a + 1
变量c = 变量a + 变量b
现在变量c是什么?答:变量c=3
<Filter应用> 做筛选条件、缩小表的范围,节省时间,但是方法并不唯一,根据你的需求而定
例4:图1-7-2 统计男生人数
假设这是100万行数据,我每行扫描一遍,发现是男生就记数,这样是不是很慢?
所以我们需要缩小计算范围,既然是只统计男生人数,那么我们筛选男生的表就可以了
男生人数 = Calculate(Count([性别]) ,
[性别]="男"
)
男生人数 = Calculate(Count([性别]),
FILTER('Sheet1','Sheet1'[性别]="男")
)
男生人数 = Countrows(
FILTER('Sheet1','Sheet1'[性别]="男")
)
三种写法都可以,不要看过《The Definitive Guide to DAX》就跑出来抬扛,没有什么是唯一写法。
刚才我们都是操作一张表格,现在我们多张表操作
给
通过
英语
四级
的学生
,
英语平时成绩
+0.1分。
【先说新建列】
新成绩1 = if(
and(Related('学生表'[四级])="通过",'成绩表'[学科]="英语")
,'成绩表'[平时成绩]+0.1,BLANK())
新成绩2 = CALCULATE(sumx('成绩表',if(
and(Related('学生表'[四级])="通过",'成绩表'[学科]="英语")
,'成绩表'[平时成绩]+0.1,BLANK())
但是,上面两种方法都是在逐行扫描,判断每一行是否符合条件,如果有100万行,就要判断100万次,为了提升速度,我们可以将符合条件的人从表中筛选出来,对这张筛选后的表进行计算。
新成绩3 = CALCULATE(
var tb1=filter('成绩表','成绩表'[学科]="英语")
var tb2=filter(tb1,Related('学生表'[四级])="通过")
return
sumx(tb2,'成绩表'[平时成绩]+0.1)
)
【再说度量值】
总分 = sum('成绩表'[平时成绩])
通过四级人员的成绩 = calculate(
sum('成绩表'[平时成绩])
,filter('学生表','学生表'[四级]="通过"))
//这里不用关系函数,filter的筛选条件在自己表中
今天的知识就讲到这里,现在开始打脸
filter('学生表','学生表'[四级]="通过")
是不是一张表?
那你为什么要问我《火力全开》第7节课:Calculate第二参数为什么可以是一张表?难到我第5课没讲吗?
《孙兴华讲PowerBI火力全开》笔记07 大家抬扛的地方
考生人数= Calculate(CountRows('学生表'),
'成绩表'
)
Calculate第二参数可以是一张表你理解不?这节课我们就说到这里。
关于你们的第二个问题:为什么学生表是一端,成绩表是多端,现在多端在筛选器上,而一端在计算器上。下节课咱们就打脸,我一次就讲一件事。
关于Filter配合Calculate等更高级的应用,我们按《The Definitive Guide to DAX》顺序一点一点的讲
注:《火力全开》是我自己通过经验调整的学习顺利,《DAX神功》(DAX原理)是按《The Definitive Guide to DAX》的顺序讲,
讲原理必会招来水军的攻击,为了防止他们组团说我讲的顺序乱,所以我就按权威书籍的顺序讲,但是内容肯定不一样哦!
比如《线性代数》,权威书籍都是从行列式开始讲的,其实我更建议从向量开始讲,但是如果真的这么做了,肯定会招来争议。于是我先讲《火力全开》再讲《DAX神功》,有了前面的铺垫后,
《DAX神功》就可以按
《The Definitive Guide to DAX》的顺序讲了。
就跟有些人不让我用中文变量和中文案例,说我使用中文太LOW了,我跟他们讲道理是没有用的,我只能让他去看以下法律条文的规定,因为法律是权威:
《宪法》第4条第4款
《宪法》第19条第2款和第4款
《国家通用语言文字法》第一章 第4条