DAX 表达式主要用于创建度量列(Measure),度量值是根据用户选择的Filter和公式,计算聚合值,DAX表达式基本上都是引用对应的函数,函数的执行有表级(Table-Level)上下文和行级(Row-Level)上下文之别;其交互行为都是通过表之间的关系实现的,用户选择的Filter,会通过关系对数据进行过滤,是PowerBI报表呈现的数据具有动态交互的特性。在我开发的PowerBI报表项目中,经常使用的DAX表达式函数,其实并不是很多,本文分享一些入门级的常用函数,附上简单的注释,希望对新手设计PowerBI报表有所帮助。

我的PowerBI开发系列的文章目录:PowerBI开发

一,常用的操作符

在DAX表达式中,常用的操作符是:

  • 文本使用双引号作为界定符,
  • 等号是“=”号,不等号是:<>
  • 赋值使用“=”号,
  • 布尔值使用 TRUE()和FALSE()函数,
  • 空值使用BLANK()函数表示,
  • 集合使用大括号{}表示,例如,包含三个元素的集合: {1,2,3}
  • 字符的连接符号是:&
  • 逻辑运算符号是:逻辑与是 &&,逻辑或是: ||

二,过滤函数

过滤函数能够操作数据的上下文,以实现数据的动态计算,功能非常强大,用于度量中,关于过滤器函数的详细介绍,请查看:《DAX 第三篇:过滤器函数

三,统计函数

统计函数用于创建聚合,对数据进行统计分析。在使用统计函数时,必须考虑到数据模型,表之间关系,数据重复等因素,一般都会搭配过滤函数实现数据的提取和分析。

统计量一般是:均值、求和、计数、最大值、最小值、求中位数、获得分位数等。关于统计函数的详细介绍,请查看:《DAX 第六篇:统计函数

四,文本函数

在DAX表达式中,字符串使用双引号界定:

1,格式函数

按照指定的格式把值转换成文本

FORMAT(<value>, <format_string>)  

2,空值

在DAX中,空值(Blank) 和数据库的NULL值是相同的,通过函数ISBLANK(value)判断当前的字段值是否是空值。

BLANK()
ISBLANK(<value>)

3,查找函数

在一段文本中查找字符串时,从左向右读取文本,查找函数返回第一次匹配的字符的序号,序号从1开始,依次递增。search函数不区分大小写,而find函数区分大小写。

FIND(<find_text>, <within_text>[, [<start_num>][, <NotFoundValue>]])
SEARCH(<find_text>, <within_text>[, [<start_num>][, <NotFoundValue>]])

参数 NotFoundValue 是可选的,当查找不到匹配的子串时,返回该参数的值,一般设置为0,-1或BLANK()。

如果不设置该参数,而查找函数查找不到匹配的子串时,函数返回错误。可以通过IFERROR函数处理错误,例如:

= IFERROR(SEARCH("-",[PostalCode]),-)  

5,拼接函数

把表中的数据按照指定的分隔符拼接成字符串

CONCATENATEX(<table>, <expression>, [delimiter])  

示例,Employees表中包含[FirstName] 和 [LastName]两列,把这两列拼接成一个字符串:

CONCATENATEX(Employees, [FirstName] & “ “ & [LastName], “,”)

6,包含字符串

检查文本是否包含特定的字符串,并可以使用通配符:? 代表单个字符,* 代表任意多个字符,~ 代表把通配符转义为普通字符。

CONTAINSSTRING(<within_text>, <find_text>)
CONTAINSSTRINGEXACT(<within_text>, <find_text>)

注意:CONTAINSSTRING不是大小写敏感的,而CONTAINSSTRINGEXACT 函数是大小写敏感的。

7,截取子串

从字符串中截取特定长度的字符串,start_pos是指字符的位置,从1开始,num_chars是指截取的子串的长度:

LEFT(<text>, <num_chars>)
RIGHT(<text>, <num_chars>)
MID(<text>, <start_pos>, <num_chars>)

8,替换

instance_num是指替换的次数,num_chars是指被替换的字符的数量:

SUBSTITUTE(<text>, <old_text>, <new_text>, <instance_num>)
REPLACE(<old_text>, <start_pos>, <num_chars>, <new_text>)

9,其他常用函数

  • TRIM(<text>) :清理文本两端的空格
  • LOWER(<text>) :把文本转换为小写格式
  • UPPER (<text>) :把文本转换为大写格式
  • LEN(<text>) :计算文本的字符数量
  • VALUE(<text>) :把文本型数值转换为数值型

五,逻辑函数

逻辑函数用于表达式,以返回逻辑运算的结果。

1,逻辑判断函数

检查逻辑条件是否满足,如果满足,返回value_if_true,如果不满足,返回value_if_false。

IF(logical_test>,<value_if_true>, <value_if_false>)  

等于使用“=”表示,逻辑与使用“&&”表示,逻辑或使用“||”表示,而逻辑非,通常使用NOT()函数来实现:

NOT(<logical>) 

 2,布尔值函数

通常用于表示数据库的bit类型的值,表示逻辑真和假

TRUE()
FALSE()

3,错误函数

如果表达式返回错误,返回value_if_error;如果表达式不返回错误,返回表达式的值。

IFERROR(expression, value_if_error) 

错误函数等价于:

IFERROR(A,B) := IF(ISERROR(A), B, A)

4,包含逻辑

表(Table)表达式是由大括号构成的集合:{value1,value2,,vlaueN}

IN操作符的用法是:

<scalarExpr> IN <tableExpr> 

包含行函数的用法是:

CONTAINSROW(<tableExpr>, <scalarExpr>[, <scalarExpr>, …]) 

示例,以下两个表达式是等价的:

[Color] IN { "Red", "Yellow", "Blue" }
CONTAINSROW({ "Red", "Yellow", "Blue" }, [Color])

六,信息函数

信息函数用于查看值的信息,比如,查看值是否跟类型相匹配等。

1,检查空值

ISBANK( value ):用于检测value是否是blank

=IF( ISBLANK('CalculatedMeasures'[PreviousYearTotalSales])
, BLANK()
, ( 'CalculatedMeasures'[Total Sales]-'CalculatedMeasures'[PreviousYearTotalSales] )
/'CalculatedMeasures'[PreviousYearTotalSales])

2,检查错误

ISERROR(value):用于检测value是否是错误

= IF( ISERROR( SUM('ResellerSales_USD'[SalesAmount_USD]) /SUM('InternetSales_USD'[SalesAmount_USD])  )
, BLANK()
, SUM('ResellerSales_USD'[SalesAmount_USD]) /SUM('InternetSales_USD'[SalesAmount_USD])
)

3,检查值的特性

  • ISEVEN(number):检查数字的奇偶性
  • ISODD(number):检查数字的奇偶性
  • ISNUMBER(<value>):检查值是否是数字
  • ISTEXT(<value>):检查值是否是文本
  • ISNONTEXT(<value>) :如果值不是文本,或者是blank,那么返回True;否则返回False。

4,包含数据

如果在这些列中存在或包含所有引用列的值,则返回true; 否则,该函数返回false。

CONTAINS(<table>, <columnName>, <value>[, <columnName>, <value>]…) 

例如,下面的DAX表示:检查FactSales表中是否存在一行数据,其ProductKey列的值是214,同时CustomerKey列的值是11185,如果存在这样一行数据,那么返回True,否则返回False:

=CONTAINS(FactSales, [ProductKey], , [CustomerKey], ) 

5,包含行

IN 操作符和CONTAINSROW()函数的作用是相同的:

<scalarExpr> IN <tableExpr>
( <scalarExpr1>, <scalarExpr2>, … ) IN <tableExpr> CONTAINSROW(<tableExpr>, <scalarExpr>[, <scalarExpr>, …])

DAX中NOT IN不是一个操作符,要实现不存在的操作,可以把NOT 放到整个IN表达式的前面:

NOT [Color] IN { "Red", "Yellow", "Blue" }

例如,使用IN和 CONTAINSROW()函数表示包含特定的值,并列出其否定形式:

FILTER(ALL(DimProduct[Color]), [Color] IN { "Red", "Yellow", "Blue" })
FILTER(ALL(DimProduct[Color]), CONTAINSROW({ "Red", "Yellow", "Blue" }, [Color])) FILTER(ALL(DimProduct[Color]), NOT [Color] IN { "Red", "Yellow", "Blue" })
FILTER(ALL(DimProduct[Color]), NOT CONTAINSROW({ "Red", "Yellow", "Blue" }, [Color]))

6,返回用户信息

从链接时提供给系统的凭证中返回域名和用户名:

USERNAME() 

例如,从授权用户表中查找用户,如果该用户存在于授权表(UserTable)中,那么返回Allowed,否则返回空值:

=IF(CONTAINS(UsersTable,UsersTable[login], USERNAME()), "Allowed", BLANK()) 

七,算术函数和日期/时间函数

参考《Math and Trig functions》和《Date and time functions

参考文档:

DAX basics in Power BI Desktop

Data Analysis Expressions (DAX) Reference

PowerBI开发 第四篇:DAX表达式的更多相关文章

  1. PowerBI开发 第四篇:DAX 表达式基础

    DAX 表达式主要用于创建度量列(Measure),度量值是根据用户选择的Filter和公式,计算聚合值,DAX表达式基本上都是引用对应的函数,函数的执行有表级(Table-Level)上下文和行级( ...

  2. PowerBI开发 第八篇:查询参数

    在PowerBI Desktop中,用户可以定义一个或多个查询参数(Query Parameter),参数的功能是为了实现PowerBI的参数化编程,使得Data Source的属性.替换值和过滤数据 ...

  3. 基于GBT28181:SIP协议组件开发-----------第四篇SIP注册流程eXosip2实现(一)

    原创文章,引用请保证原文完整性,尊重作者劳动,原文地址http://www.cnblogs.com/qq1269122125/p/3945294.html. 上章节讲解了利用自主开发的组件SIP组件l ...

  4. PowerBI开发 第五篇:关系和交互

    PowerBI 使用 内存的列式数据库 VertiPaq,用于对已发布的数据集进行数据压缩和快速处理,能够使PowerBI报表执行脱机访问,面向列的处理,高度优化对1:N关系的处理性能.关系是数据分析 ...

  5. PowerBI开发 第五篇:关系的设计

    PowerBI 使用 内存的列式数据库 VertiPaq,用于对已发布的数据集进行数据压缩和快速处理,能够使PowerBI报表执行脱机访问,面向列的处理,高度优化对1:N关系的处理性能.PowerBI ...

  6. PowerBI开发 第十三篇:增量刷新

    PowerBI 将要解锁增量刷新(Incremental refresh)功能,这是一个令人期待的更新,使得PowerBI可以加载大数据集,并能减少数据的刷新时间和资源消耗,该功能目前处于预览状态,只 ...

  7. PowerBI开发 第三篇:报表设计技巧

    最近做了几个PowerBI报表,对PowerBI的设计有了更深的理解,对数据的塑形(sharp data),不仅可以在Data Source中实现,例如在TSQL查询脚本中,而且可以在PowerBI中 ...

  8. PowerBI开发 第十一篇:报表设计技巧(更新)

    PowerBI版本在持续的更新,这使得报表设计能够实现更多新的功能,您可以访问 PowerBI Blog查看PowerBI的最新更新信息,本文总结了PowerBI新版本的重要更新和设计技巧. 我的Po ...

  9. PowerBI开发 第七篇:数据集和数据刷新

    PowerBI报表是基于数据分析的引擎,数据真正的来源(Data Source)是数据库,文件等数据存储媒介,PowerBI支持的数据源类型多种多样.PowerBI Service(云端)有时不直接访 ...

随机推荐

  1. ASP.NET Core Razor页面 vs MVC

    作为.NET Core 2.0发行版的一部分,还有一些ASP.NET的更新.其中之一是添加了一个新的Web框架来创建"页面",而不需要复杂的ASP.NET MVC.新的Razor页 ...

  2. 前端布局之Flex语法

    前端布局一直是CSS的一个重点应用,然而基于盒子模型的传统布局方案,依赖display + position + float 属性,对于某些特殊的布局非常不方便,比如:垂直居中就不容易实现.针对这一情 ...

  3. JAVA中的四种引用以及ReferenceQueue和WeakHashMap的使用示例

    简介: 本文主要介绍JAVA中的四种引用: StrongReference(强引用).SoftReferenc(软引用).WeakReferenc(弱引用).PhantomReference(虚引用) ...

  4. JavaScript之去除前后空格//g

    使用正则表达式"//g"去除字符串中的前后空格."//"表示所要匹配的字符串,如前后空格为/^\s*|\s*$/,这里"^"表示以" ...

  5. APP应用测试技巧

    分页数据 测试分页数据,必须要满足一页数据,根据APP设置的分页数据准备一些测试数据. 满足一页数据的时候上下滑动瀑布流时, 页面数据是否会正常展示: 是否会出现第二页请求不到数据: 是否会出现重复加 ...

  6. noip普及组2004 FBI树

    FBI树 描述 我们可以把由"0"和"1"组成的字符串分为三类:全"0"串称为B串,全"1"串称为I串,既含" ...

  7. Shrio认证详解+自定义Realm

    Authentication(身份认证)是Shiro权限控制的第一步,用来告诉系统你就是你. 在提交认证的时候,我们需要给系统提交两个信息: Principals:是一个表示用户的唯一属性,可以是用户 ...

  8. MemCache在Windows环境下的搭建及启动

    MemCache在Windows环境下的搭建及启动 一.memcache服务器端的安装 1.下载memcached的安装包,memcached_en32or64.zip,下载链接:http://pan ...

  9. Ext.grid.EditorGridPanel保存

    用get方法传递编辑的数据会出现乱码,解决get乱码的方法就是encodeURI(param),然后在后台转码: String strJson =  new String(request.getPar ...

  10. [C#] 如何截取完整的网页图片

    前言 有时候浏览到非常有用的网页时,我们会选择将它加入到收藏夹中,但是网站一旦过期,以后就看不到这个网页了.当然也可以将网页打印成PDF文档保存.最新的Windows 10中的Edge浏览器支持将网页 ...