DAX函数——calculate/addcolumn/selectcolumn
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了DAX函数——calculate/addcolumn/selectcolumn相关的知识,希望对你有一定的参考价值。
参考技术A 本次记录在看到大神所做案列模板中关于新建表内容之后,仅为个人理解:在PowerBI中关于这几个函数的表述如上,那么问题来了,大神模板中addcolumns函数的第一个参数是distinct(列名),为什么不是表呢?那selectcolumns函数后是否也可以用表达式代替第一个参数“表”?身为小白的我,顺利成章的看不懂了。
新建表 = ADDCOLUMNS(DISTINCT('示例表'[订单ID]),"客户id",CALCULATE(FIRSTNONBLANK('示例表'[客户ID],'示例表'[客户ID])))
第一个参数为“表”时候,addcolumns()函数的意义为,返回这个表,并在表后增加相对应的列;第一个参数为“返回表的表达式”时候,第一列为满足表达式的原表列,然后再新增相对应的其他列。(这里用calculate(firstnoblank()) 函数,是因为将订单ID去重之后,原来的客户ID列已经不能与新的订单ID列一一对应,需要用筛选器函数calculate对其进行相应条件的筛选以满足与新的订单ID 列对应关系。
Selectcolumns () 经试验,第一个参数为表达式时候,后边新建列名称所对应的表达式也会出错,故不可用。
通过上述方法,我的理解是,表达式返回的一列姑且认为是只有一列的表,这样来看的话,addcolumns()函数的第一个参数“表”也算是满足了;另外addcolumns函数是在原表上新建列再返回到一个新表中,而selectcolumns则是在空白表新建列,故当第一个参数为表达式时候,addcolumns可以调用原表中其他列,而selectcolumns仅能调用表达式所生成的那一列。
另外,新建表对原订单金额求和时候需筛选器函数与calculate()函数与sum()函数嵌套使用(这时候sum求和的上下文只是同一订单行中的上下文),否则就相当于调用了原表中一个度量值sum(金额)(上下文为原表所有行上下文)
数据可视化之powerBI入门PowerBI中最重要的函数:CALCULATE
https://zhuanlan.zhihu.com/p/64382849
介绍DAX的时候,特别强调过一个重要的函数:CALCULATE,本文就来揭秘这个函数的计算原理以及它是如何影响上下文的。
CALCULATE的语法结构
语法:
CALCULATE(<expression>,<filter1>,<filter2>…)
- 第一个参数是计算表达式,可以执行各种聚合运算
- 从第二个参数开始,是一系列筛选条件,可以为空;如果多个筛选条件,用逗号分隔
- 所有晒选条件的交集形成最终的筛选数据集合
- 根据筛选出的数据集合执行第一个参数的聚合运算并返回运算结果
前文提到DAX函数可以更改外部上下文,现在通过实例来理解DAX中最精髓的函数CALCULATE的计算原理,并看看它是如何更改外部上下文的。
CALCULATE应用实例
导入下面这个产品明细表:
新建一个度量值求每种产品的数量:
产品数量 = COUNTROWS(‘产品明细‘)
因为每种产品的只有1行,所以求产品明细表的行数就相当于求各种产品的数量,把产品名称和该度量值拖拽入矩阵表,
这里外部上下文就是表格每行的行标签。
01 | 筛选条件为空,不影响外部上下文
现在开始用CALCULATE函数创建一个度量值:
产品数量1 = CALCULATE([产品数量])
只是用了第一个参数,筛选条件为空,因为没有内部筛选所以完全依赖外部上下文,出来的结果也和原度量值一致。
另外,介绍CALCULATE语法的时候说,第一个参数为聚合运算表达式,为什么这里没有用聚合函数而只用了一个度量值呢?这是因为度量值[产品数量]本身就是一个聚合函数运算,实际上度量值[产品数量1]等同于这个:
产品数量1 = CALCULATE(COUNTROWS(‘产品明细‘))
DAX函数可以直接引用已经创建好的度量值,可以使DAX函数看起来更简洁、更具可读性,这也是建议从最简单的度量值开始建的原因。
02 | 添加限制条件,缩小上下文
建一个度量值[产品数量2],
产品数量2 = CALCULATE([产品数量],‘产品明细‘[品牌]="苹果")
发现只有苹果的产品计数显示出来,而其他品牌的数据没有了,这是因为CALCULATE的第二个参数的限制,只筛选品牌为“苹果”的,限制了外部的上下文,非苹果的产品都不再运算。
03 | 结合ALL函数,扩大上下文
新建度量值[产品数量3],
产品数量3 = CALCULATE([产品数量],ALL(‘产品明细‘))
这次的数据居然是所有产品的数量,这是因为筛选条件使用了ALL函数,ALL(‘产品明细‘)的意思是清除产品明细表里的所有筛选,外部筛选器不起作用了,每行统计的都是该表中的所有产品。
每行的数据都是9,你可能觉得这个ALL函数没什么用,运算的数据没有什么意义,会误导人,实际上当然不是这样,这个数据使用的地方非常多,比如我们想计算每个产品数量占总产品数量的比重,直接写个度量值:
产品占比=[产品数量]/[产品数量3]
产品占比就计算出来了,这就是统计总数的一个功能。
04 | 重置上下文
新建度量值[产品数量4],
产品数量4 = CALCULATE([产品数量],
all(‘产品明细‘[产品名称]),
‘产品明细‘[类别]="手机")
先用ALL函数清除外部上下文,然后又新增了一个筛选条件,类别为"手机"的产品数量,那么结果会是什么样的呢,
每一行产品的数量都是3,正好符合建立这个度量值的逻辑,被ALL清除行标签的外部筛选后,从全部产品中统计品类为"手机"的产品的数量,所以每行都返回3.
通过以上几个简单的例子,可以领会到CALCULATE的计算逻辑,通过从第二个参数开始的筛选条件,得到一个数据集合,并利用第一个参数执行聚合运算,这不就是DAX要实现的功能:提取有用数据并执行聚合运算吗,所以说CALCULATE几乎就是DAX本身,它就是实现DAX功能的引擎,并能灵活的操控外部上下文,后面的数据分析也都离不开CALCULATE的身影。
文中案例数据在公众号中请回复“CALCULATE案例”下载
以上是关于DAX函数——calculate/addcolumn/selectcolumn的主要内容,如果未能解决你的问题,请参考以下文章