PowerBI开发 第四篇:DAX表明式

DAX
表明式紧要用于创立度量列(Measure),度量值是按照用户挑选的Filter和公式,总计聚合值,DAX表明式基本上都是引用对应的函数,函数的推行有表级(Table-Level)上下文和行级(Row-Level)上下文之别;其交互行为都是通过表之间的关联贯彻的,用户采纳的Filter,会透过涉及对数码举办过滤,是PowerBI报表展现的多寡颇具动态交互的性状。在自己付出的PowerBI报表项目中,平日应用的DAX表达式函数,其实并不是无数,本文分享部分入门级的常用函数,附上简单的笺注,希望对新手设计PowerBI报表有所扶助。

一,常用的操作符

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

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

二,过滤函数

过滤函数可以操作数据的上下文,以落实数据的动态统计,效用非常强大。

1,关联函数

 Related函数重临跟当前的数目行有关系的表的单个值,

RELATED(related_table[column]) 

Related函数要求当前表和关联表之间存在涉嫌(Relationship),当前表和关联表之间存在many-to-one的关系,从关联表中回到单个值。

Related函数运行在行上下文(row context),因而,只可以用来总括列的表明式。

示例:表InternetSales_USD和SalesTerritory之间存在关联,从表SalesTerritory获取SalesTerritoryCountry的值,并经过FILTER函数举办过滤,总括表InternetSales_USD中字段[SalesAmount_USD]的加和:

= SUMX(FILTER( 'InternetSales_USD', RELATED('SalesTerritory'[SalesTerritoryCountry]) <>"United States" )  ,'InternetSales_USD'[SalesAmount_USD])  

RELATEDTABLE
用于one-to-many的涉嫌,用于重返被过滤的有所数据行组成的表。

2,过滤函数

Filter函数,再次回到被过滤之后的表,是表数据的子集:

FILTER(<table>,<filter>)  

透过过滤条件,获取表的子集,过滤函数重临的表只好用来总结。过滤函数不是独自的,必须置于(embedded)到此外函数中作为一个表值参数。

3,统计函数

Calculate函数,在过滤器的上下文中统计表明式,重返单个值:

CALCULATE(<expression>,<filter1>,<filter2>…)  

参数expression是计量的表明式,受到filter参数的上下文的震慑,假诺filter参数改变多少的上下文,那么在新的上下文中总结表达式。总计函数的最大特点是力所能及移除过滤器,在过滤参数中,假设数据列上已经存在一个过滤器,那么移除该过滤器,应用当前的过滤器。

For each column used in a filter argument, any existing filters on that
column are removed, and the filter used in the filter argument is
applied instead.

示范:在总括比例关系时,使用总结函数的移除过滤器的机能:

=( SUM('ResellerSales_USD'[SalesAmount_USD]))  
 /CALCULATE( SUM('ResellerSales_USD'[SalesAmount_USD])  
           ,ALL('ResellerSales_USD'))  

表明式中的分母,使用统计函数,其中,第一个过滤器参数使用ALL过滤函数,使得sum表明式总结所有的多寡行,这种作为重写对数据表的隐式过滤器。

4,移除过滤器

ALL函数重临表中的有所数据行,清理随意过滤器,用于对全表执行聚合运算。ALL函数首要用来统计比例关系,常用来分母中。

ALL( {<table> | <column>)

5,去重函数

Distinct
重临单列的表,包含无重复的值,也就是说,从表中移除重复值,只回去列的唯一值。

DISTINCT(<column>) 

6,过滤器的值

函数Values再次来到被过滤的绝无仅有值,在同一个表中的别样Column被过滤,那么重临被过滤的脚下Column的唯一值。Values函数和Distinct函数很一般,唯一的不等是Values函数会再次回到Unknown,这是因为涉及的Table中带有部匹配的多寡行,和Left
Join的右表中带有NULL值很一般。

VALUES(<TableNameOrColumnName>)  

When you use the VALUES function in a context that has been filtered,
 the unique values returned by VALUES are affected by the filter.

组合CONCATENATEX函数,可以把具有过滤器的值连接成字符串。注意,DAX表明式使用
& 举行字符串的连天。

7,探测直接过滤(filtered directly)

如果指定的Column被一向过滤(filtered
directly)
,函数重临True;当同一个Table中的其他Column被过滤,切片器(Slicer)中被波及的Column,默认设置是整个平素过滤,函数重回True;如若Column上未曾直接的过滤,或者同一个Table中的其他Column被过滤,或者被有涉嫌的Table过滤,函数重临False

ISFILTERED(<columnName>)  

直接过滤器的数值通过函数Filters重回:

FILTERS(<columnName>)  

8,探测关联过滤

假定同一个Table中的其他Column被过滤,或者被有提到的Table过滤,函数再次回到True

ISCROSSFILTERED(<columnName>)  

9,保持过滤器

函数 KeepFilters 的效应是保障过滤器,用于统计函数(CALCULATE 和
CALCULATETABLE)中。默认状况下,统计函数的过滤器参数(filter
argument)会对过滤表数据,当在同一的字段上安装过滤器参数(filter
argument)时,该参数会交替已经存在的过滤器;当相同的字段上未曾过滤器参数(filter
argument)时,已经存在的过滤器不受影响。函数KeepFilters会改变总结函数的作为,当在盘算函数使用函数KeepFilters时,表的上下文是过滤器参数(filter
argument)和已经存在的过滤器的混合,也就是说,表的上下文同时面临已经存在的过滤器和测算函数的过滤器参数(filter
argument)的影响。总结函数替换已经存在的过滤器,而函数
KeepFilters会添加已经存在的过滤,求交集。

KEEPFILTERS(<expression>) 

三,总括函数

总括函数是最强力的函数,同时也是最复杂的函数,为数据的解析,提供充裕强力的工具,同时,在运用总计函数时,必须考虑到数据模型,表之间关系,数据重复等元素,一般都会搭配过滤函数实现数量的领取和剖析。

1,求和函数

从表中统计每一个行的加和,只有数值会被加和,忽略空值,date,逻辑值或文本值:

SUMX(<table>, <expression>)  

 示例,第一个参数是过滤器再次来到的表值,总括[Freight]的加和:

=SUMX(FILTER(InternetSales, InternetSales[SalesTerritoryID]=5),[Freight])  

可以把SUMX函数,转换为CALCULATE函数:

=CALCULATE( SUM(InternetSales[Freight]), FILTER(InternetSales, InternetSales[SalesTerritoryID]=5))  

2,计数函数

算算函数分为:COUNTX和COUNTAX,COUNTX只总计数值,忽略空值(blank),date,逻辑值或文本值;COUNTAX函数总计非空值(blank),包含数值,date,逻辑值或文本值。

COUNTX(<table>,<expression>)  
COUNTAX(<table>,<expression>)  

不同:假使列中含有表明式,而表达式的结果是空值,可是,COUNTAX/COUNTX函数把带有公式的列值作为非空(nonblank)看待,在那种情景下,计数函数会扩张计数值。

设若COUNTAX函数没有多少列做计数,重临blank;假使COUNTAX函数聚合的数据列都是blank,重临0。

3,唯一值计数

总结列的唯一值计数,参数是表列,允许是擅自数据类型,当找不到任何数据行时,再次回到BLANK,否则,总括唯一值的数额。

DISTINCTCOUNT(<column>)

4,分组聚合函数

DAX
中效果最强劲的函数,对相互关系的Table遵照一定的字段,分组聚合,由于分组列是绝无仅有的,通过SUMMARIZE函数,可以拿走多列的唯一值。

SUMMARIZE(<table>, <groupBy_columnName>[, <groupBy_columnName>]…[, <name>, <expression>]…) 

示范:对数据表 ResellerSales_USD ,根据字段 Date提姆e[CalendarYear]
和 ProductCategory[ProductCategoryName]分组,计算 SUM(ResellerSales_USD[SalesAmount_USD]wwwlehu6.vip乐虎官网,)和 SUM(ResellerSales_USD[DiscountAmount])

SUMMARIZE(ResellerSales_USD  
      , DateTime[CalendarYear]  
      , ProductCategory[ProductCategoryName]  
      , "Sales Amount (USD)", SUM(ResellerSales_USD[SalesAmount_USD])  
      , "Discount Amount (USD)", SUM(ResellerSales_USD[DiscountAmount])  
      ) 

分组聚合函数,可以利用关系,引用相关表的字段,也就是说,SUMMARIZE函数可以对有涉及的表执行连接(join)运算,总计笛卡尔(Carl)乘积,对Join的结果集执行分组聚合,例如:

summarize
 (
     'Internet Sales',
     'Product'[Product Name],
     'Date'[Calendar Year],
     "Total Sales Amount", sum('Internet Sales'[Sales Amount])
 )

从数据表Date中得到字段Calendar Year的前提是,数据表Date和Internet
Sales之间存在涉嫌,从数额表Product中赢得字段Product
Name的前提是:数据表Product和Internet Sales之间存在涉嫌。

分组聚合函数用于创制新表,在Modeling菜单中,通过“New
Table”从DAX表达式中开改进的Table:

wwwlehu6.vip乐虎官网 1

参考文档:SUMMARIZE – groupping in data models (DAX – Power Pivot,
Power
BI)

四,文本函数

在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]),-1)  

5,拼接函数

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

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

演示,Employees表中涵盖[FirstName] 和
[LastName]两列,把这两列拼接成一个字符串:

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

五,逻辑函数

1,逻辑判断函数

检查逻辑条件是否满意,假如满意,重返value_if_true,要是不满意,重回value_if_false。

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

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

NOT(<logical>) 

 2,布尔值函数

TRUE()  
FALSE() 

经常用于表示数据库的bit类型的值

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,为指定的关联指定询问时(query-time)的样子(cross-filtering
direction)

函数CrossFilter使用已经存在的关系,重写的涉嫌设置只在询问时有效。

CROSSFILTER(<columnName1>, <columnName2>, <direction>)  

2,使用关系

函数UseRelationship只好动用已经存在的关联,通过关系六个端点(endpoint)来指定关系,关系的情况是不根本的,平日,使用该函数的目标是在Calculate函数中使用不活跃(Inactive)的关联。

USERELATIONSHIP(<columnName1>,<columnName2>) 

 

参考文档:

DAX basics in Power BI
Desktop

Data Analysis Expressions (DAX)
Reference

You can leave a response, or trackback from your own site.

Leave a Reply

网站地图xml地图