数据分析表达式(DAX)--几个常用函数

  • DAX表达式:Power Pivot的特有函数集
  • DAX思考逻辑
  • 常用函数
    • SWITCH 函数
    • FILTER 函数
    • CALCULATE 函数
    • SUM 函数
    • RELATED 函数
    • ALL 函数
    • ALLSELECTED 函数
  • 示例
  • ALL函数和ALLSELECTED函数的区别

DAX表达式:Power Pivot的特有函数集

  1. DAX表达式的结果应用在数据透视表中
  2. DAX表达式的结果作用于整列或者表中所有行
  3. DAX表达式主要是用来解决度量和规则问题的,要想得到最终的计算结果还需要在数据透视中加入维度(度量、规则+维度=>值)
  4. 还需注意以下几点:
    a. 表名用“ ’ ’ ”单引号引用;
    b. 字段名(列名)用“[ ]”引用;
    c. 要注意函数表达式中参数的数据类型,尤其是要将“表”与“数值”正确区分;
    d. 与Excel公式相同,除了直接在编辑器的公式区域输入公式外还可以通过单击公式编辑栏前的“fx”图标启动“插入函数”对话框,在对话框中选择需要的函数使用(区别是Excel是表格数据计算,而DAX表达式是表结构计算);
    e. 表达式中的函数名不分大小写,比如“ALL”函数也可以记作“all”。
    :DAX表达式得到的是一种针对度量的计算规则,而不是具体的值,而规则要和维度结合,所以在设计DAX表达式时就要考虑到要和什么维度结合起来使用。

DAX思考逻辑

  • 主键是什么
  • 使用场景下的维度
  • 维度与主键的对应关系
  • 如何设计DAX

常用函数

SWITCH 函数

根据值列表计算表达式,并返回多个可能的结果表达式之一。

SWITCH(<expression>,<value1>,<result1>,[<value2>,<result2 >,]...[,<else>])

参数:

  • expression
    任何返回单个标量值的 DAX 表达式,其中,表达式将计算多次(针对每行/上下文)。

  • value
    要与 expression 的结果匹配的常量值。

  • result
    当 expression 的结果与对应的 value 匹配时,要进行计算的任何标量表达式。

  • else
    当 expression 的结果与任何 value 参数不匹配时,要进行计算的任何标量表达式。

返回值:
来自其中一个 result 表达式的标量值(如果与 value 有匹配),或者来自 else 表达式(如果与任何 value 都不匹配)的标量值。

注: SWITCH函数与比较运算符连用时语法:

SWITCH(true(),<expression1>,<result1>,[<expression2>,<result2 >,]...[,<else>])

参数:

  • true()
    固定用法。

  • expression
    比较判断表达式

  • result
    当满足 expression 表达式时,要进行计算的任何标量表达式。

FILTER 函数

返回表示另一个表或表达式的子集的表。

FILTER(<table>,<filter>)

参数:

  • table
    要筛选的表。 此表还可以是产生的结果是表的表达式。
  • filter
    要为该表的每一行计算的布尔表达式。 例如,[Amount] > 0 或 [Region] = “France”。

返回值:
只包含筛选行的表。

CALCULATE 函数

在指定筛选器修改的上下文中计算表达式(也称为Power Pivot中的万能函数)。

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

参数:

  • expression
    要进行计算的表达式。
  • filter1,filter2,…
    (可选)逗号分隔的表达式列表,这些表达式是定义筛选器的布尔表达式或表表达式。
    用作第一个参数的表达式在本质上与度量值相同。

下列限制适用于用作参数的布尔表达式:

  • 表达式不能引用度量值。
  • 表达式不能使用嵌套的 CALCULATE 函数。
  • 表达式不能使用扫描表或返回表的任何函数,包括聚合函数。
    但是,布尔表达式可以使用查找单个值或计算标量值的任何函数。

返回值:
作为表达式的结果的值。

SUM 函数

对列中的所有数字求和。

SUM(<column>)

参数:

  • column
    包含要执行求和运算的数字的列。

返回值:
返回小数,如果有任何行包含非数字值,则返回空值。

RELATED 函数

从另一个表返回相关值。

RELATED(<column>)

参数:

  • column
    包含要检索的值的列(合并字段)。

返回值:
与当前行相关的单个值。

注: RELATED 函数要求当前表与包含相关信息的表之间存在关系。 需要指定包含所需数据的列,该函数将通过现有的多对一关系从相关表中的指定列中提取值。如果不存在关系,则必须创建关系。

ALL 函数

返回表中的所有行或者返回列中的所有值,同时忽略可能已应用的任何筛选器。 此函数可用于清除筛选器并对表中的所有行创建计算。

 ALL( {<table> | <column>[, <column>[, <column>[,]]]} )

参数:

  • table
    要清除其筛选器的表。
  • column
    要清除其筛选器的列。

ALL 函数的参数必须或者是对某一基表的引用,或者是对某一基列的引用。 不能将表的表达式或列的表达式与 ALL 函数一起使用。

返回值:
删除了筛选器的表或列。

函数和用法:

  • ALL(Table):从指定表中删除所有筛选器。 实际上,ALL(Table) 返回表中的所有值,并且删除上下文中可能已应用的任何筛选器。

  • ALL (Column[, Column[, …]]):删除表中指定列的所有筛选器;表中针对其他列的所有其他筛选器仍应用。 所有列参数必须都来自同一个表。

  • ALLEXCEPT(Table, Column1 [,Column2]…):删除表中所有上下文筛选器,但已应用于指定列的筛选器除外。

ALLSELECTED 函数

从当前查询的列和行中删除上下文筛选器,同时保留所有其他上下文筛选器或显式筛选器。

ALLSELECTED 函数获取表示查询中所有行和列的上下文,同时保留显式筛选器以及行和列筛选器之外的上下文。 此函数可用于获取查询中的直观合计。

ALLSELECTED([<tableName> | <columnName>])

参数:

  • tableName
    使用标准 DAX 语法的现有表的名称。 此参数不能是表达式。 此参数可选。
  • columnName
    使用标准 DAX 语法的现有列的名称,通常是完全限定的名称。 它不能是表达式。 此参数可选。

返回值:
没有任何列和行筛选器的查询的上下文。
注: 此函数与 ALL() 不同,因为它显式保留在查询内设置的所有筛选器,并且它保留除行和列筛选器之外的所有上下文筛选器。

示例

1、求出每名销售人员手中高赢单率低风险商机金额占总商机金额的百分比(高赢单率:赢单率=0.75 / 低风险:有无拖欠还款情况=“无”)
解析:

  • 维度:销售人员
  • 度量:商机金额
  • 规则:百分比

(商机相关企业信息)

(商机记录)

操作步骤:
(1) 使用switch函数将赢单率中的数值描述替换为文字描述(0.15=>低、0.25=>低、0.5=>中、0.75=>高)

WinOdds = SWITCH(‘商机记录’[赢单率],0.15,“L”,0.25,“L”,0.5,“M”,0.75,“H”,"-")

或者与比较运算符连用:

WinOdds = SWITCH(true(),[赢单率]<0.5,“L”,[赢单率]<0.75,“M”,[赢单率]<=1,“H”,"-")

(2) 使用related函数将商机相关企业信息表中的有无拖欠还款情况字段内容合并到商机记录表中

Risk = RELATED(‘商机相关企业信息’[有无拖欠还款情况])

(3)使用calculate与filter函数的嵌套函数创建高赢单率低风险商机金额加总值

高赢单低风险金额合计 = CALCULATE(SUM(‘商机记录’[商机金额(M)]),FILTER(‘商机记录’,‘商机记录’[WinOdds]=“H”),FILTER(‘商机记录’,‘商机记录’[Risk]=“无”))

金额合计 = SUM(‘商机记录’[商机金额(M)])

(4) 用高赢单率低风险商机金额加总值/商机金额加总值求出高赢单率低风险金额百分比

百分比 = [高赢单低风险金额合计]/[金额合计]

2、求所有城市的金额合计

所有城市金额合计 = CALCULATE([金额合计],all(‘商机相关企业信息’[城市]))

ALL函数和ALLSELECTED函数的区别

ALL函数中参数写什么就忽略什么,如果是表名,忽略整个表;如果是字段则忽略指定字段的筛选作用,筛选作用即维度,维度又分为汇总维度和切片器的筛选维度。ALL函数既忽略汇总维度又忽略筛选维度,ALLSELECTED函数是ALL的组员,筛选作用比ALL弱,它只忽略汇总维度,不忽略筛选维度。

2.所有城市金额合计 = CALCULATE([金额合计],ALL(‘商机相关企业信息’[城市]))
2-1.所有城市金额合计 = CALCULATE([金额合计],ALLSELECTED(‘商机相关企业信息’[城市]))


更多DAX表达式参考网站

更多推荐

数据分析表达式(DAX)--几个常用函数