6.1 PowerBI系列之DAX函数专题 - filter,calculate,calculatetable

filter

一、一些知识点
1.filter可以作为表函数(返回表)或筛选器函数(作为calculate等函数条件)。返回特定筛选条件下的数据;
2.filter不能接受多个参数作为条件,多条件时用and或or或者&& 或||来实现;
二、例子:

表函数filter = filter('产品表','产品表'[商品类别]="Furniture")
表函数filter1 = filter('订单表','订单表'[城市]="New York City" && '订单表'[销售额]>2000)// 多条件
表函数filter2 =  filter('订单表',and('订单表'[城市]="New York City" , '订单表'[销售额]>2000))

calculate

一、一些知识点
1.calculate根据筛选条件进行计算,可以用表或者布尔类型作为参数,可以传多个参数;
2.所有函数的计算事实上都要使用到calculate;
3.除calculate和calculatetable的计算是从外到内,从后往前,从下到上,其他所有DAX函数都是从内到外,从前往后,从上到下,例如sumx,是filter先满足条件后,在进行之后的汇总。
6.1 PowerBI系列之DAX函数专题 - filter,calculate,calculatetable_第1张图片
但在内层用了keepfilter时,会与外层筛选条件取交集,保留外层上下文
6.1 PowerBI系列之DAX函数专题 - filter,calculate,calculatetable_第2张图片

二、例子:

measure = {blank()} //新建一张空表,用于管理度量值
(1)家具销售额 = calculate(sum('订单表'[销售额]),'产品表'[商品类别]="Furniture") --布尔类型参数
//用布尔条件筛选数据会忽略在商品类别字段的外部上下文(已经存在的条件),所以三行数据的值相同,如下图

6.1 PowerBI系列之DAX函数专题 - filter,calculate,calculatetable_第3张图片
这种写法等价于,

家具销售额= calculate(sum('订单表'[销售额]),filter(
																		all('产品表'[商品类别]),
																		//忽略外部上下文,以全部类别进行计算,即使存在外部条件也重新筛选出要求的对应值,*但其他字段的筛选仍然有作用*
																		'产品表'[商品类别]="Furniture"))
(2)家具销售额2= calculate(sum('订单表'[销售额]),filter(
																		'产品表’,
																		'产品表'[商品类别]="Furniture"))
//与直接传入布尔值不同,此时的filter会传入对应条件字段的的外部上下文(已经筛选出的条件),因此会显示正确的结果,如上图“家具销售额2”
(3)a.不考虑外部上下文的calculate多条件 = calculate(sum('订单表'[销售额]),
										'订单表'[城市]="New York City",
										'产品表'[商品类别]="Furniture")--布尔表达式 多条件之间是与的关系,结果取交集。同时不考虑外部上下文
		b.考虑外部上下文的calculate多条件** = calculate(sum('订单表'[销售额]),
										filter('订单表','订单表'[城市]="New York City"),
										filter('产品表','产品表'[商品类别]="Furniture"))
(4)多条件为或的calculate= calculate(sum('订单表'[销售额]),
										'订单表'[城市]="New York City"||'产品表'[商品类别]="Furniture")
(5)calculate和var
大于平均价格订单总额=
var b_ave_amount = average('订单表'[销售额])
return caculate(sum('订单表'[销售额]),'订单表'[销售额]>v_ave_amount
(6)将外层上下文数据直接放在函数里参与计算
大于平均价格订单总额2=calculate(sum('订单表'[销售额]),'订单表'[销售额]>average('订单表'[销售额]))

calculatetable

一、一些知识点
1.caculatetable与calculate在用法上完全相同,只不过前者返回表,后者返回标量值;
2.caculatetable与filter都是返回表,但是calculate不会保留外部上下文,而filter会合并上下文;
3.calculatetable也可以作为calculate的参数,但是由于前述原因,尽量使用filter等调节器作为参数。
二、例子

1.表calculatetable1 = calculatetable('产品表','产品表'[商品类别]="Furniture")
在没有外部上下文的时候,上述度量值等同于下述代码返回的结果:
    filter('产品表','产品表'[商品类别]="Furniture")
2.  表calculatetable2 = calculatetable(//该函数会先用furniture筛选出对应的产品,然后才在values中返回的产品中计算产品数量
									addcolumns(
														values('产品表'[商品类别]),   -- 指定表
														"产品个数", -- 指定列名
														countrows('产品表') -- 指定列值,后执行
														),
									'产品表‘[商品类别] = “furniture”)--先执行
3.表calculatetable3 = filter(//filter先不会去利用funiture过滤数据,而是先执行它的第一个表达式返回统计到的所有产品个数,最后采用条件过滤
											addcolumns(
																	values('产品表'[商品类别])),
																	"产品个数",
																	countrows('产品表') --先执行
																	),
											'产品表'[商品类别]="furniture") --后执行
4.分组统计=summarize('订单表', --指定列名1
产品表'[商品类别], --指定列名1取值
"产品个数", --指定列名2
count('产品表'[产品编号])) --指定列名2取值

你可能感兴趣的:(powerbi)