DAX函数一

DAX框架:三个非常重要的基础概念,语法、函数和上下文。

DAX度量值的工作原理就是筛选和计算。用于计算的函数和Excel有很多相似的,但Excel可以应用于单个单元格或行列,DAX只能引用完整的表或列。所以这时候筛选函数就有很大的价值了,在配合聚合,时间智能,迭代等函数,那么对数据的处理就游刃有余了。

在常见函数之前,我们要先了解DAX语法的结构。语法包含总成公式的不同元素。
语法包含以下元素:
等号运算符(=)
引用列 [列名] ,公式中的列引用用方括号[]括起来,与引用单元的Excel不同,DAX公式始终引用列
数学运算符(+ - * / 等等)

接下来看一个度量值公式:
销售额总计 := SUM( FactSales [ SalesAmount ])
度量值公式在度量值名称后面用冒号等号“:=”.
FactSales 是一个引用表
SalesAmount 是 FactSales表中 的一个列

DAX相比于Excel,有以下几个独特点:

  • DAX函数始终引用完整的列或表,如果要引用表或列中特定的值,就需要向公式中添加筛选器
  • 如果需要逐行自定义计算,DAX函数可提供让你使用当前值或相关值作为一种参数来执行计算的函数(因上下文而异),所以就要了解上下文的相关信息
  • DAX包含的许多函数都将返回表,而不是返回值。表不会显示,它只会用于向其他函数提供输入。例如,你可以检索一个表,然后对表中的非重复数据进行计数;或者计算多个已筛选表或列的动态总和
  • DAX包含多种"时间智能"函数。利用这些函数,可以自定义选择日期范围,并基于它们做动态计算。

上下文
上下文是要了解的最重要的DAX概念之一。DAX中有两种上下文:行上下文,筛选上下文

我们前面所说的计算列和度量值,都是在上下文中进行的。上下文这个概念非常使人迷惑,我们可以把 “上下文” 理解为 “环境” ,在特定环境下进行的计算。
行上下文
行上下文比较好理解,一般是计算列。例如 ‘’利润 = 价格-成本‘’
筛选上下文
如果我们在Excel中建立一个透视表,把度量值放到值的区域内,然后把需要的字段放到行/列的区域内,这样我们得到的透视表中的每个值都是行和列进行筛选后的一个结果值。
这个概念如果放到DAX中,就是筛选上下文

筛选函数
有两个强大的筛选函数:CALCULATEFILTER
CALCULARE(<计算式>,<筛选条件1>,<筛选条件2>,…)
CALCULARE的局限性:CALCULARE函数里筛选条件的参数只能是[列]=固定值的方法,例如:求咖啡种类=”拿铁”, 价格>30的销售数量,CALCULATE(SUM(sales),[咖啡种类]=‘拿铁’,[价格]>30)。
但是如果我们要求季度销售量超过200杯的分店的销售数量的总和就比较难
FILTER
FILTER是筛选函数,不是计算函数。所以公式返回的是一张表。所以无法单独使用,一般会和CALCULATE搭配使用,也可以和聚合函数搭配使用。例如:countrows(filter(表,筛选条件))来计算表的行数。
FILTER函数的语法第一个参数使任意一张表,第二部分是筛选条件,筛选结果是TRUE/FALSE的表达式。
例如 CALCULATE(SUM(sales),[咖啡种类]=‘拿铁’,[价格]>30) 用FILTER可以写成calculate(sum(sales),filter(‘咖啡数据’,[咖啡种类]=‘拿铁’&&[价格]>30))
filter对所筛选的表进行逐行的横向扫描,针对每一行循环的执行设定的筛选程序,我们把这类工具叫做Iterator迭代函数SUMX等带有X的函数和Earlier函数都属于迭代函数。它们和其他函数的区别是工作的时候可以意识到它所指的是哪一行,我们把这个工作叫做创造行上下文

ALL()函数
返回表中所有的行和列,忽略任何的筛选器。
应用场景:计算部分占总体的百分比,计算部分在总体中的排名
场景1,计算各城市销售额的排名情况。
错误公式:RANKX(‘销售记录’,sum(‘销售记录’[销售额]),DESC)
上面的公式如果拉取出来结果显示的排名都为1
在这里插入图片描述
因为城市也对排名起到了筛选作用,上面公式的意思就是每个城市的销售额在这个城市中的排名情况。所以最后的结果都是1
正确的公式是:RANKX(ALL(‘销售记录’[销售城市]),SUM(‘销售记录’[销售额]),DECS)
在这里插入图片描述

场景2,计算每个城市销售额占总销售额的百分比
SUM(‘销售记录’[销售额])/CALCULATE(SUM(‘销售记录’[销售额]),ALL(‘销售记录’))

如果城市上面再有一个大区层级,我们需要计算每个大区中每个城市的销售额百分比占比情况,公式是SUM(‘销售记录’[销售额])/CALCULATE(SUM(‘销售记录’[销售额]),ALL(‘销售记录’[销售城市]))
区别是如果我们是以每个大区作为一个总体的100%,那么我们就要清除城市对数据的筛选作用,CALCULATE(SUM(‘销售记录’[销售额]),ALL(‘销售记录’[销售城市]))这个公式就是计算每个大区的销售总额,然后 每个城市销售总额/每个大区的销售总额 就得到结果了
在这里插入图片描述

ALLSELECTED(tablename|columnname)函数
再想象一个场景,我只想看费城的销售额占费城、纽约、芝加哥的百分比,那么我们就需要ALLSELECTED这个函数了
作用:从当前选择的行或列中清除上下文筛选器,同时保留其他上下文筛选器。
按筛选占总体% = ‘销售记录’[销售金额]/CALCULATE(‘销售记录’[销售金额],ALLSELECTED(‘销售记录’))
按筛选占分类% = ‘销售记录’[销售金额]/CALCULATE(‘销售记录’[销售金额],ALLSELECTED(‘销售记录’[销售城市]))

在这里插入图片描述
仅从值上来看,按筛选占分类%和分类占比%是相等的,但是意义却不尽相同,假如将切片器仅选中费城和纽约,那么此时的按筛选占分类%=费城销量156/(选中的东区城市销量:费城156)=100%,而分类占比依然是56.32%。

由此可见,占比的定义变化多端,大有文章,要正确使用ALL(Table)或ALL (Column[, Column[, …]])和ALLSELECTED([tablename|columnname])函数。

ALLEXCEPT(table,column[,column[,…]])函数
作用:删除表中除已应用于指定列的筛选器之外的所有上下文筛选器。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值