Power BI 之 DAX语法规范详解1
文章预览:
- Power BI 之 DAX语法规范详解 1
- 前言
- 表构造函数{()}
- Lookupvalue函数
- Related函数:
- Relatedtable函数
- 筛选引擎Calculate
- 单条件筛选
- 多条件筛选
- 筛选表
- 高级筛选器Filter
- 什么时候用Filter函数
- Values人工造表
- DISTINCT
- VALUES与DISTINCT的差异
- ALL函数
- ALL函数应用于表(计算占比)
- ALLSELECTED函数
- ALL函数应用于列(分类占比)
- ALLEXCEPT函数
- ALLNOBLANKROW
- 聚合函数
- 迭代函数
- SUMX
- Earlier函数 [当前行]
- 条件判断函数
- 1.IFERROR
- 2.if条件判断
- 3.switch多项条件判断
- switch的特殊用法
Power BI 之 DAX语法规范详解 1
前言
数据分析表达式 (DAX) 是在 Analysis Services、Power BI 以及 Excel 中的 Power Pivot 使用的公式表达式语言。
可供参考学习的文档:
DAX是什么 - DAX圣经 - Power BI极客 (powerbigeek.com)
ALLEXCEPT 函数 (DAX) - DAX | Microsoft Docs
用到的Excel表:
链接:https://pan.baidu.com/s/1WdXej1qo3VXfKCPlvsKcrg
提取码:b60l
一些需要注意的:
1、关于数据建模,注意 一对一,一对多,多对多的关系
一端可以向多端进行筛选,多端可以向一端申请内容
2、写函数的时候尽量都写上表名 ‘表名’[列名]
3、建数据库的时候一般都是建一个多端的表,其他的都是一端的表,永远都是一端去连多端
表构造函数{()}
只包含一列的表:
表={“张三”,“李四”,“王五”}
表={(“张三”),(“李四”),(“王五”)}
返回包含一列或多列的表:
表={
(“张三”,“男”,“22”,“实习生”),
(“李四”,“男”,“25”,“工程师”),
(“王五”,“女”,“22”,“销售”)
}
如果没有指定数据类型或某列不同行的数据类型不同时,DAX会自动将该列转为自动识别的数据类型
设置表头:
员工表=
VAR a=
{
(“张三”,“男”,“22”,“实习生”),
(“李四”,“男”,“25”,“工程师”),
(“王五”,“女”,“22”,“销售”)
}
Return
SelectColumns(a,“姓名”,[Value1],“性别”,[Value2],“年龄”,[Value3],“职位”,[Value4])
Lookupvalue函数
语法:Lookupvalue(把哪张表的哪个列取出,那张表的参数,自己表的参数)
多端向一端拿取数据的时候,例如销售表是多端,想要商品表的进价
新建列:
进价 = LOOKUPVALUE(‘商品表’[进价],‘商品表’[商品编码],‘销售表’[商品编码])
Related函数:
(多端找一端)(数据表找基础表)
测试 = LOOKUPVALUE(‘商品表’[进价],‘商品表’[商品编码],‘销售表’[商品编码]) * ‘销售表’[销售数量]
销售成本 = [销售数量] *RELATED(‘商品表’[进价])
Relatedtable函数
(一端找多端)(基础表找数据表)
订单数量 = COUNTROWS(RELATEDTABLE(‘销售表’)
COUNTROWS 函数:统计表的行数
筛选引擎Calculate
我们把不带任何筛选条件、CALCULATE只有第一参数的度量称为元度量。
引擎Calculate分为两部分,第一部分为计算器,第二部分为筛选器
单条件筛选
A01产品销量1 = CALCULATE([总销量],‘商品表’[商品编码]=“A01”)
A01产品销量2 = CALCULATE([总销量],‘销售表’[商品编码]=“A01”)
多条件筛选
两个列的多条件筛选
多条件 = CALCULATE([总销量],‘商品表’[商品名称]=“A01”,‘商品表’[进价]=1800)
一个列的多条件筛选
多条件1 = CALCULATE([总销量],‘商品表’[商品编码] in {“A01”,“A02”,“A03”})
多条件2 = CALCULATE([总销量],not ‘商品表’[商品编码] in {“A01”,“A02”,“A03”})
筛选表
Calculatetable(表,筛选条件)
可以多表运作筛选,最后返回一张表
筛选表 = CALCULATETABLE(‘销售表’,‘销售表’[店号]=1,‘商品表’[商品编码]=“A01”)
高级筛选器Filter
返回一个表,用于表示另一个表或表达式的子集,不能单独使用
Filter是一个表函数,Filter函数对筛选的表进行横向的**逐行扫描**,这样的函数叫迭代函数
举例:
Countrows(Filter(表,筛选条件))
先筛选,再计算行数Calculate(表达式(度量值),Filter(‘表名’,筛选条件))
计算1班男同学的总成绩
- 1班男生a = CALCULATE(‘度量值’[总成绩],‘花名册’[班级]=“1班”,‘花名册’[性别]=“男”)
- 1班男生b = CALCULATE(‘度量值’[总成绩],FILTER(‘花名册’,‘花名册’[班级]=“1班”&&‘花名册’[性别]=“男”))
简单的筛选时(筛选条件是列和固定值比较时),它们的效果是一样的
在Calculate函数中的直接筛选条件里,我们只能输入:
‘表’[列] = 固定值 或 ‘表’[列] <> 固定值‘表’[列]>=固定值 或 ‘表’[列] <= 固定值
‘表’[列] > 固定值 或 ‘表’[列] < 固定值
什么时候用Filter函数
[列] = [度量值]、[列] = 公式、[列] = [列]、
[度量值] = [度量值]、[度量值] = 公式、[度量值] = 固定值
注意:Filter第一参数的表,必须是唯一参数的表(一端的表)
例如 筛选总分>250,(总分是一个度量值),以下Filter2的写法是错误的
√:Filter1 = CALCULATE([总成绩],FILTER(‘花名册’,[总成绩]>250))
×:Filter2 = CALCULATE([总成绩],FILTER(‘成绩表’,[总成绩]>250))
度量值 [总成绩] = SUM(‘成绩表’[分数]) ,
那么,是否可以不使用度量值,将公式直接带入如Filter5?
答案是否定的
×:Filter5 =CALCULATE([总成绩],FILTER(‘花名册’,SUM(‘成绩表’[分数])>250))
Filter5 带入 SUM(‘成绩表’[分数]) ,只是带入了一个聚合函数,不具备筛选功能,可以改成如下形式:
√:Filter6 = CALCULATE([总成绩],FILTER(‘花名册’,CALCULATE(SUM(‘成绩表’[分数]))>250))
Values人工造表
如果没有一张唯一的表,那我们就可以使用Values人工造表
1、Values(表[列])
VALUES(‘成绩表’[学号])------------------可以拿到成绩表中学号的唯一值
Filter3 = CALCULATE([总成绩],FILTER(VALUES(‘成绩表’[学号]),[总成绩]>250))
2、values(表)
复制一张表
DISTINCT
DISTINCT(表名[字段名]) 返回:去重后唯一值的列
DISTINCT(表) 返回:去除重复行的表
DISTINCT(返回表的表达式) 比如套用filter函数,先筛选再去重
VALUES与DISTINCT的差异
VALUES包括没有匹配的空白行(能返回空行),DISTINCT不返回没有匹配的空白行
DISTINCT函数允许列名或任何有效的表达式作为其参数,但VALUES函数仅接受列名或表名作为参数
ALL函数
ALL函数 ---------一般计算占比时会用到
作用:清除筛选(清除度量值的所有筛选) 返回:清楚筛选后的表格和列
筛选表
ALL函数应用于表(计算占比)
商品表中商品总数=CountRows(‘商品表’)
销售表中的商品数量= Calculate(CountRows(‘商品表’),‘销售表’)
这个时候可以用 [销售表中的商品数量] / [商品表中商品总数] ,求出销售过的商品类型占所有商品类型的占比,但是前提是矩阵里不能放行,否则就会具备筛选功能,如果我们不想要这个筛选功能,就可以用ALL函数来清楚筛选
不能筛选的总数 = CountRows(ALL(‘商品表’))
占比 = [销售表中的商品数量] / [不能筛选的总数]
计算销售表中每个商品的占比
总销量 = SUM(‘销售表’[销售数量])
禁止筛选的总销量 = CALCULATE ([总销量],all(‘销售表’))
每个商品的占比 = [总销量] / [禁止筛选的总销量]
当ALL参数为表是,忽略所有的筛选条件,无论是该图表内还是外部切片器
ALLSELECTED函数
- 观察上图,占比100%变成90% ,这个时候出现了问题
外部加了筛选器,占比可能会受影响 ,这个时候将ALL函数替换成ALLSELECTED
ALLSELECTED函数不受内部筛选,受外部筛选
ALL函数应用于列(分类占比)
新建列
大类 = LOOKUPVALUE(‘商品表’[大类],‘商品表’[商品编码],‘销售表’[商品编码])
规格 = LOOKUPVALUE(‘商品表’[规格],‘商品表’[商品编码],‘销售表’[商品编码])
度量值
取消列筛选 = CALCULATE([总销量],all(‘销售表’[规格]))
↑ 观察上图,规格的筛选并没有起作用
↑ 观察上图,对于日期的筛选起了作用
总结:当ALL函数的参数为列时,忽略该列筛选,其他图表字段或外部筛选对其产生作用
注意:ALL函数在引用列的时候,必须与矩阵的行和列在同一张表
假设,ALL函数引用的是销售表,矩阵行和列来自商品表,就会出错
占比 = [总销量] / [取消列筛选]
ALLEXCEPT函数
删除了所有筛选器(除了指定列的筛选器)
语法: Allexcept(表名[列名]) 等同于 All(表名[列名1],表名[列名2],表名[列名3],……)
可以是多个列,用逗号隔开
ALLNOBLANKROW
作用:返回表中除空白行以外的所有行(一般用于核对差异)
例如,签到表,名单是一个表,签字是一个表,核对哪些人没有到
聚合函数
SUM、AVERAGE(数值和/数值个数)、AVERAGEA(数值和/列的项数)、DISTINCTCOUNT、
COUNTA(计算列中单元格不为空的数目)、COUNTBLANK(计算列中单元格为空白数量)、PRODUCT(计算列中单元格乘积)
迭代函数
聚合函数+X
SUMX
将每一行按算数表达式计算后,再将计算结果求和
列 = sumx(‘表’, [列1] - [列] ) 对每一行逐行扫描,汇总求和
列 = CALCULATE( SUMX(‘表’, [列1] - [列2]) ) 加一个筛选,相当于展示每行的 列1 - 列2
AverageX、MaxX、MinX、CountX、CountaX、ProductX……它们都是行上下文函数
Earlier函数 [当前行]
例1:
用sumx只是为了逐行扫描,不具备实际作用
下个订单日期 = sumx( FILTER( ‘表’, ‘表’[序号] = EARLIER(‘表’[序号]) + 1),‘表’[销售日期])
sumx第二个参数不是表达式,不产生计算,所以结果就是销售日期
例2:累计求和
累计销量 = SUMX(FILTER(‘表’,‘表’[序号]<=EARLIER(‘表’[序号])),‘表’[销售量])
1、FILTER返回 序号小于等于当前序号的所有行的 表 2、对这个表进行逐行扫描,扫描 ‘表’[销售量] 求和
例3:分组累计求和
商品累计求和 = SUMX(FILTER(‘表’,‘表’[序号]<=EARLIER(‘表’[序号])&& ‘表’[商品]=EARLIER(‘表’[商品]) ),‘表’[销售量])
表没有序号比较也可以用销售日期比较 同理
例4:累计购买次数
第几次购买=COUNTROWS(FILTER(‘表1’,‘表1’[姓名]=EARLIER(‘表1’[姓名])&& ‘表1’[序号]<=EARLIER(‘表1’[序号])))
条件判断函数
1.IFERROR
IFERROR遇到错误时使用指定数值替换
销售金额 = [销售数量]*[单价]
表达式计算遇到错误,返回空( blank() 换成数值也是可以的 ):
销售金额 = IFERROR([销售数量]*[单价],BLANK())
2.if条件判断
例1:称呼 = IF([性别]=“男”,“先生”,“女士”)
第三个参数可以省略不写,省略时返回为空
例2:
时间间隔 = IF([取款日期]=BLANK(),BLANK(),[取款日期]-[存款日期])
3.switch多项条件判断
switch(表达式,值1,结果1,……,[else])
最后一个参数可以省略不写,省略时返回为空
月份 = SWITCH(‘例3’[月],1,“一月”,2,“二月”,3,“三月”,
4,“四月”,5,“五月”,6,“六月”,7,“七月”,8,“八月”,
9,“九月”,10,“十月”,11,“十一月”,12,“十二月”,“无法识别”)
switch的特殊用法
使用TRUE做第一参数,返回条件判断List中第一个为TRUE的结果
年龄段 = SWITCH(TRUE(),‘例4’[年龄]<30,“30岁以下”,
‘例4’[年龄]<40,“30-40岁”,‘例4’[年龄]<50,“40-50岁”,
“50岁以上”)
若是多个条件,使用 && 连接即可
欢迎关注我的博客,与我一起学习数据分析,我将持续分享我的学习过程,我是 热爱学习的小翁同学~
Power BI 之 DAX语法规范详解1相关推荐
- java 注释 超链接_java_Java代码注释规范详解,代码附有注释对程序开发者来 - phpStudy...
Java代码注释规范详解 代码附有注释对程序开发者来说非常重要,随着技术的发展,在项目开发过程中,必须要求程序员写好代码注释,这样有利于代码后续的编写和使用. 基本的要求: 1.注释形式统一 在整个应 ...
- 在Power BI中用DAX新建列的方式进行累计求和
在Power BI中用DAX新建列的方式进行累计求和 DAX 新建列来累计求和 累计求和 DAX 新建列 DAX函数 Filter DAX函数 EARLIER DAX函数 SUMX DAX 新建列来累 ...
- USB Type C规范详解
USB Type C规范详解 目前USB Type C接口应用非常广泛,可以传输DP,USB,PCIE,音频等信号,已经不是纯粹的用来传输USB信号了,即USB Type C摆脱了和USB的从属关系, ...
- POWER BI 中DAX函数的应用
POWER BI 中DAX函数的应用 什么是DAX函数 DAX 是公式或表达式中可用于计算并返回一个或多个值的函数.运算符或常量的集合. 简单来说,DAX 可帮助你通过模型中已有的数据来创建新信息. ...
- POWER BI 中DAX函数的应用(下篇)
POWER BI 中DAX函数的应用(下篇) 任务:创建度量值公式 下载并打开 Contoso 销售示例 Power BI Desktop 文件. 在"报表"视图的字段列表中,右键 ...
- php psr2规范,php标准规范详解
本文主要和大家分享php标准规范详解,希望能帮助到大家. psr0:自动加载标准已经被 psr4 替代,可以了解下 1. 强制:完全限定命名空间和类的格式:\\(\)* 2. 强制:每个命名空间必须有 ...
- [Python从零到壹] 五.网络爬虫之BeautifulSoup基础语法万字详解
欢迎大家来到"Python从零到壹",在这里我将分享约200篇Python系列文章,带大家一起去学习和玩耍,看看Python这个有趣的世界.所有文章都将结合案例.代码和作者的经验讲 ...
- 计算机网络中的语法 语义 时序的概念,网络iso协议及语义语法时序详解
网络iso协议及语义语法时序详解 计算机学习 网络协议的三要素 在计算机网路中,通信发生在不同系统的实体之间,,实体(entity)是能够发送和接收信息的任何事物.然而,两个实体间仅发送比特流就指望能 ...
- Atitit.jdk java8的语法特性详解 attilax 总结
Atitit.jdk java8的语法特性详解 attilax 总结 1.1. 类型推断这个特别有趣的.鲜为人知的特性1 2. Lambda1 2.1. 内部迭代意味着改由Java类库来进行迭代,而不 ...
最新文章
- you need python_Life is short,you need Python——Python序列(列表)
- 8. An Introduction to MCMC for Machine Learning (3)
- 【工具】WPS安卓电脑无广告版
- 《JAVA与模式》之建造模式
- 搭建和测试Android JAVA NDK
- Jenkins 在 Tomcat 中的部署及代码静态检查工具集成
- linux 脚本 变量为空,Shell判断一个变量是否为空
- java poi操作word 2003 2007
- 定时执行sql统计数据库连接数并记录到表中
- java io 创建临时文件,用Java创建一个指定的临时文件
- atitit 解决教学记忆问题 压缩算法原理 哈夫曼 LZ77 gzip zlib deflate算法.docx 目录 1. 压缩理论	1 1.1. 柯氏复杂性	1 2. 1 RLE	1
- 12 序列化器Serializer的使用
- python(模块)xlsxwriter
- 拉格朗日插值法(理论详解)
- 泰坦尼克号幸存者预测(分类)
- 计算机 无法进入睡眠模式,win7电脑无法正常进入睡眠模式怎么办
- 使用路由器上网微信qq绝地求生腾讯系打开慢或打不开的问题
- php蓝奏云网盘源码,蓝奏云网盘打开目录/上传/下载源码
- pmp考试难度怎么样?难吗?
- 九章量子计算机属于专用计算机吗,九章“问世”了 你知道什么是量子计算机吗?...
热门文章
- php5那一年,ps cs5是哪一年的
- JavaScript中的数据转换
- camera中文版软件 ip_【IP Camera Viewer中文版下载】IP Camera Viewer(网络摄像机监控软件) v4.09 官方版-开心电玩...
- 马斯克解释星际飞船原型测试失败:操作失误是主因
- ESP8266_02程序的编译与下载
- flash动画制作修改教程及超实用的小技巧分享,硕思闪客精灵
- 淘宝直播:天猫618穿透下沉市场的强力武器
- 项目管理 : 为什么别人没你辛苦,却又比你赚的多?
- php服务宕机,PHP漏洞|一张GIF图片就能让服务器宕机的PHP漏洞
- 这世上最悲哀的事莫过于:你的好,他不懂!