导图社区 LV2数据建模课程全图(上)(无二维码)
无数据
PowerBI数据建模核心功能课程全图,每天一点点进步亿点点,简约而不简单,简约让BI更简单。
编辑于2023-05-30 22:56:15 四川省
PowerBI 简约派
|
LV2数据建模
上
商
业
智
能
分
析
培
训
计
划
更
高
效
的
Power
BI
使
用
技
巧
全
功
略
每天一点点
进步亿点点
简约而不简单
简约,让BI更简单
3
常用DAX公式
FORMAT
定义
将值转换为采用指定数值格式的文本。
语法
FORMAT( 表达式 , 格式类型 , 区域选择 )
逻辑
1. 输入需要指定格式的度量值。
2. 输入对应的数值格式。第三个参数是选择不同区域的内容,一般省略。
对比
展示FORMAT的各类格式结果。点击按钮可查看更加全面的FORMAT格式设置。
常用 公式
FORMAT 货币 = FORMAT( 12345.67, "Currency") FORMAT 定点小数 = FORMAT( 12345.67, "Fixed") FORMAT 标准 = FORMAT( 12345.67, "Standard") FORMAT 百分比 = FORMAT( 12345.67, "Percent") FORMAT 科学计数法 = FORMAT( 12345.67, "Scientific") FORMAT 货币 简写 = FORMAT( 12345.67 , "¥#,##0.00" ) FORMAT 定点小数 简写 = FORMAT( 12345.67 , "0.0" ) FORMAT 标准 简写 = FORMAT( 12345.67 , "#,##0.00" ) FORMAT 百分比 简写 = FORMAT( 12345.67 , "0.0%" ) FORMAT 科学计数法 简写 = FORMAT( 12345.67 , "0.00E+00" ) FORMAT 日期 = FORMAT( TODAY() , "dd/mm/yyyy" ) FORMAT 日期 加- = FORMAT( TODAY() , "YYYY-MM-DD" ) FORMAT 日期 中文 = FORMAT( TODAY() , "YYYY年MM月DD日" ) FORMAT 月份 = FORMAT( TODAY() , "MM月" ) FORMAT 星期几 = FORMAT( TODAY() , "DDDD" )
数据类型: STRING:文本;DATETIME:日期/时间,若不写时间,则为00:00:00;INTEGER:整数 BOOLEAN:布尔值;CURRENCY:货币格式;DOUBLE:两位小数·
对比 结果
SELECTCOLUMNS
定义
返回具有从表中选择的列以及DAX表达式指定的新列的表。
语法
SELECTCOLUMNS( 表 , [列名称1] , 表达式1 , ...... )
逻辑
1. 选定所需的表;
2. 输入需要的列以及对应列名称。
3. 列名称可随意修改,不影响原本的数据沿袭功能;与SUMMARIZE的最大区别为SUMMARIZE能汇总统计,SELECTCOLUMNS按原表全量记录统计。
对比
以三个SELECTCOLUMNS案例讲解使用逻辑
常用 公式
SELECTCOLUMNS 新建表 = SELECTCOLUMNS( 'SA_销售记录' , "销售大区" , [销售大区] , "销售金额" , [1.0 基础 度量值] )
SELECTCOLUMNS 新建表 综合应用案例 = SELECTCOLUMNS( ADDCOLUMNS( SUMMARIZE( 'SA_销售记录' , 'SA_销售记录'[销售大区] ) , "销售金额" , [1.0 基础 度量值] ) , "销售金额" , [销售金额] )
SELECTCOLUMNS 新建表 修改列名称 数据沿袭概念 = SELECTCOLUMNS( SUMMARIZE( 'SA_销售记录' , 'SA_销售记录'[销售大区] ) , "区域" , [销售大区] , "销售金额" , [1.0 基础 度量值] )
对比 结果
EXCEPT/INTERSECT
定义
1. EXCEPT:返回未在右侧表中显示的左侧表的行;
2. INTERSECT:返回在右侧表中显示的左侧表的行。
语法
EXCEPT/INTERSECT( 左侧表 , 右侧表 )
逻辑
1. 首先确定交并补的逻辑,并集用UNION,补集用EXCEPT,交集用INTERSECT,若非交集用两个EXCEPT和一个UNION。
2. 参数一为左侧表,参数二为右侧表,左右侧表不同,结果不同。
对比
以UNION、EXCEPT、INTERSECT以及EXCEPT*2+UNION解决交并补和非交集的需求。
常用 公式
UNION 并集计算 = VAR BIAO_1 = { "南充" , "成都" , "内江" , "绵阳" , "雅安" , "广元" } VAR BIAO_2 = { "南充" , "成都" , "内江" , "凉山" , "巴中" , "广安" , "乐山" } RETURN UNION( BIAO_1 , BIAO_2 )
EXCEPT 补集计算 = VAR BIAO_1 = { "南充" , "成都" , "内江" , "绵阳" , "雅安" , "广元" } VAR BIAO_2 = { "南充" , "成都" , "内江" , "凉山" , "巴中" , "广安" , "乐山" } RETURN EXCEPT( BIAO_1 , BIAO_2 )
INTERSECT 交集计算 = VAR BIAO_1 = { "南充" , "成都" , "内江" , "绵阳" , "雅安" , "广元" } VAR BIAO_2 = { "南充" , "成都" , "内江" , "凉山" , "巴中" , "广安" , "乐山" } RETURN INTERSECT( BIAO_1 , BIAO_2 )
EXCEPT+UNION 非交集计算 = VAR BIAO_1 = { "南充" , "成都" , "内江" , "绵阳" , "雅安" , "广元" } VAR BIAO_2 = { "南充" , "成都" , "内江" , "凉山" , "巴中" , "广安" , "乐山" } RETURN UNION( EXCEPT( BIAO_1 , BIAO_2 ) , EXCEPT( BIAO_2 , BIAO_1 ) )
对比 结果
3
常用DAX公式
CONCATENATEX
定义
计算表上每个行的表达式,然后用单个字符串结果返回这些值的串接,值之间用指定的分隔符分隔。
语法
CONCATENATEX( '表' , 串接的表列 , 分隔符 , 排序表达式 , 升序ASC/降序DESC )
逻辑
1. 确定需要串接的表内容,存放在一张表中,并在公式中输入串接的表列。
2. 根据需求设置分隔符,以及排序规则。
对比
展示三种不同的CONCATENATEX用法
常用 公式
CONCATENATEX 销售大区 = CONCATENATEX( VALUES ( 'SA_销售记录'[销售大区] ), 'SA_销售记录'[销售大区], "、" )
CONCATENATEX 销售大区 TOP3 = VAR TOP3 = CALCULATETABLE( VALUES( 'SA_销售记录'[销售大区] ), TOPN( 3, VALUES( 'SA_销售记录'[销售大区] ) , [1.0 基础 度量值] ) ) RETURN CONCATENATEX ( TOP3 , 'SA_销售记录'[销售大区] , "、" , [1.0 基础 度量值] , DESC)
CONCATENATEX 销售大区 TOP3及销售额 = VAR TOP3 = CALCULATETABLE( VALUES( 'SA_销售记录'[销售大区] ) , TOPN( 3 , VALUES( 'SA_销售记录'[销售大区] ) , [1.0 基础 度量值] ) ) VAR BIAO = ADDCOLUMNS( SUMMARIZE( TOP3 , [销售大区] ) , "销售额" , [1.0 基础 度量值] , "信息" , [销售大区] & "(" & FORMAT( [1.0 基础 度量值] , "0.0" ) & "万)" ) RETURN CONCATENATEX( BIAO , [信息] , UNICHAR( 10 ) , [销售额] , DESC )
对比 结果
FIND/SEARCH
定义
返回一个文本字符串在另一个文本字符串中的起始位置。FIND区分大小写,SEARCH不区分大小写。
语法
FIND/SEARCH( "搜索的文本" , '搜索表'搜索列 , 搜索的起始位置 , 替代值 )
逻辑
1. FIND与SEARCH运算逻辑与参数内容相同,但结果不同,FIND区分大小写,SEARCH不区分大小写,同时FIND不支持通配符,
2. SEARCH支持通配符。FIND/SEARCH可以在度量值中、新建列、新建表中使用,公式添加一个布尔运算。
对比
以FIND/SEARCH在度量值、新建列、新建表中的使用情况进行讲解。
常用 公式
FIND 包含R字母的销售额 = CALCULATE( [1.0 基础 度量值] , FILTER( 'SA_销售记录' , FIND( "R" , [产品型号名称] , , 0 ) ) )
SEARCH 包含R/r字母的销售额 = CALCULATE( [1.0 基础 度量值] , FILTER( 'SA_销售记录' , SEARCH( "R" , [产品型号名称] , , 0 ) ) )
FIND 从第二个字母开始查询包含R的销售额 = CALCULATE( [1.0 基础 度量值] , FILTER( 'SA_销售记录' , FIND( "R" , [产品型号名称] , 2 , 0 ) ) )
FIND/SEARCH 新建表 查询包含R的产品名称 = FILTER( VALUES( 'SA_销售记录'[产品型号名称] ) , FIND( "R" , [产品型号名称] , , 0 ) )
FIND/SEARCH 产品型号名称是否包含R = IF( FIND( "R" , [产品型号名称] , , 0 ) , "Y" , "N" )
FIND/SEARCH产品型号名称是否首字母为S = IF( FIND( "S" , MID( 'SA_销售记录'[产品型号名称] , 1 , 1 ) , , 0 ) , "Y" , "N" )
对比 结果
TOPN
定义
根据指定的表达式返回指定数目的前几行。
语法
TOPN(行数 ,表表达式 ,排序的表达式 ,排序规则ASC升序/DESC降序 )
逻辑
1. TOPN在内部组建一个以参数二和参数三的虚拟建模表。
2. 通过参数三的大小进行排序,并根据参数一的数量选择对应参数五排序规则下的内容。默认为降序DESC。
对比
以TOPN两种不同表格组建方式讲解底层逻辑,并以新建参数的方式动态选择TOPN的行数。
常用 公式
TOPN TOP3产品名称 VALUES = CALCULATE( [1.0 基础 度量值] , TOPN( 3 , VALUES( 'SA_销售记录'[产品名称] ) , [1.0 基础 度量值] , DESC ) )
TOPN TOP3产品名称 ALL = CALCULATE( [1.0 基础 度量值] , TOPN( 3 , ALL( 'SA_销售记录'[产品名称] ) , [1.0 基础 度量值] , DESC ) )
TOPN TOP N 产品名称 = CALCULATE( [1.0 基础 度量值] , TOPN( [3.16 TOPN_N参数 值] , VALUES( 'SA_销售记录'[产品名称] ) , [1.0 基础 度量值] ) )
对比 结果
SWITCH
定义
根据表达式的值返回不同结果。
语法
SWITCH( 表达式 , 值1 , 结果1 , 值2 , 结果2 , ...... , 替代值 )
逻辑
1. 表达式固定为TRUE() , 输入的值为一个布尔表达式,判断为TRUE即返回对应结果,也可用FALSE。
2. 表达式为对应字段,输入值为字段等于某个值的表达式,如果相等即返回对应结果。
对比
以新建表讲解两种不同的写作方式,以及使用TRUE进行多条件判断的结果返回;展示用SWITCH选择不同度量值展示结果。
常用 公式
SWITCH 多条件判断 = ADDCOLUMNS( SUMMARIZE( 'SA_销售记录' , 'SA_销售记录'[产品名称] , 'SA_销售记录'[销售大区] ) , "销售额" , [1.0 基础 度量值] , "销售额区间" , SWITCH( TRUE(), [1.0 基础 度量值] >= 1000 , "1000万以上" , [1.0 基础 度量值] >= 8000 , "800万-1000万" , [1.0 基础 度量值] >= 5000 , "500万-800万" , [1.0 基础 度量值] >= 200 , "200万-500万" , [1.0 基础 度量值] >= 100 , "100万-200万" , "0-100万" ) , "区域" , SWITCH( [销售大区], "南充" , "川北" , "德阳" , "川北" , BLANK() ) , "川北销售额区间" , SWITCH( TRUE(), [销售大区] = "南充" && [1.0 基础 度量值] >= 1000 , "川北1000万以上" , [销售大区] = "德阳" && [1.0 基础 度量值] >= 1000 , "川北1000万以上" , BLANK() ) )
对比 结果
UNICHAR
定义
返回给定数值引用的Unicode字符。
语法
UNICHAR( Unicode字符 )
逻辑
1. 使用UNICHAR+Unicode字符,制作对应图标,UNICHAR( 10 )固定位换行符。
2. 使用微软输入法,可以直接输入对应表情的图标。
对比
以两种不同的方式展示效果,并联合文字信息做使用场景展示。
常用 公式
UNICHAR 回车 = "总计销售额" & UNICHAR( 10 ) & FORMAT( [1.0 基础 度量值] , "0.0" ) & "万"
UNICHAR 向左箭头 = UNICHAR( 129120 ) UNICHAR 向上箭头 = UNICHAR( 129029 ) UNICHAR 向下箭头 = UNICHAR( 129055 ) UNICHAR 向右箭头 = UNICHAR( 129154 )
对比 结果
ISFILTERED/ISCROSSFILTERED
定义
ISFILTERED:存在针对指定列的直接筛选器时,返回TRUE;ISCROSSFILTERED:对指定表或列进行交叉筛选时,返回TRUE。
语法
ISFILTERED/ISCROSSFILTERED( '表'[列] )
逻辑
确定是否需要对表格的交叉筛选进行判断,确定用ISFILTERED/ISCROSSFILTERED。
对比
以两种不同的筛选上下文逻辑,对四个度量值进行对比。
常用 公式
ISFILTERD 判断产品名称是否筛选 = ISFILTERED( 'SA_销售记录'[产品名称] )
ISFILTERD 判断销售大区是否筛选 = ISFILTERED( 'SA_销售记录'[销售大区] )
ISCROSSFILTERD 产品名称 = ISCROSSFILTERED( 'SA_销售记录'[产品名称] )
ISCROSSFILTERD 销售大区 = ISCROSSFILTERED( 'SA_销售记录'[销售大区] )
对比 结果
3
常用DAX公式
DATATABLE
定义
返回具有以内联方式定义的数据的表
语法
DATATABLE( "列名1" , 列1格式 , "列名2" , 列2格式 , { { "列1的第一行" , "列2的第一行" } , { "列1的第二行" , "列2的第二行" } } )
逻辑
1. 确定每一列的列名与格式,对应格式代码如下方备注内容。
2. 向DATATABLE中输入对应列的每一行数据,里层每一组{}为引用对应一行的数据,每一行数据需要对应列的数量与格式,外层的{}为整个列表的汇总符号。
对比
模拟一张产品信息表,并分别展示对应格式的写作。
常用 公式
DATATABLE 新建匿名表 = DATATABLE( "产品名称" , STRING , "上架时间" , DATETIME , "批次" , STRING , "数量" , INTEGER , "布尔值" , BOOLEAN , "货币" ,CURRENCY , "小数" , DOUBLE , { { "棒球手套" , "2013-1-10" , "A004" , 3 , TRUE , 100 , 1.5} , { "球棒与球棒袋" , "2013-1-30" , "A005" , 2 , FALSE , 150 , 2.3} , { "头盔" , "2013-2-10" , "A006" , 1 , FALSE , 200 , 3.8 } , { "棒球服" , "2014-5-10" , "A007" , 1 , TRUE , 300 , 4.5 } , { "捕手护具" , "2015-3-30" , "A004" , 2 , TRUE , 350, 5.9} , { "硬式棒球" , "2016-6-10" , "A004" , 3 , TRUE , 500 , 6.0 } } )
数据类型: STRING:文本;DATETIME:日期/时间,若不写时间,则为00:00:00;INTEGER:整数 BOOLEAN:布尔值;CURRENCY:货币格式;DOUBLE:两位小数·
对比 结果
LOOKUPVALUE
定义
从表中检索某个值
语法
LOOKUPVALUE( '表结果'[结果列] , '结果表'[查找列1] , '匹配表'[匹配列1] , '结果表'[查找列2] , '匹配表'[匹配列2] , '结果表'[查找列3] , [匹配值] , ...... )
逻辑
1. 确定需要检索的结果列。
2. 分组代入需要查找列和匹配列,或者是查找列与匹配值。
对比
类似“VLOOKUP”的方式进行对比操作,展示单条件、多条件的检索。
常用 公式
LOOKUPVALUE = LOOKUPVALUE( 'SA_销售记录'[产品名称] , 'SA_销售记录'[销售金额] , 3199 )
LOOKUPVALUE 批次 = LOOKUPVALUE( '3.08 DATATABLE 新建匿名表'[批次] , '3.08 DATATABLE 新建匿名表'[产品名称] , 'SA_销售记录'[产品名称] )
LOOKUPVALUE 新建表 并匹配对应数据 = ADDCOLUMNS( VALUES( 'SA_销售记录'[产品名称] ) , "销售额" , LOOKUPVALUE( '3.05 ADDCOLUMNS 新建表'[销售额] , '3.05 ADDCOLUMNS 新建表'[产品名称] , [产品名称] ) , "成本" , LOOKUPVALUE( '3.05 ADDCOLUMNS 新建表'[成本] , '3.05 ADDCOLUMNS 新建表'[产品名称] , [产品名称] ) )
LOOKUPVALUE 新建匿名表 并匹配对应数据 = ADDCOLUMNS( DATATABLE( "产品名称" , STRING ,{ { "棒球手套" } , { "球棒与球棒袋" } , { "头盔" } , { "棒球服" } , { "捕手护具" } , { "硬式棒球" } } ) , "销售额" , LOOKUPVALUE( '3.05 ADDCOLUMNS 新建表'[销售额] , '3.05 ADDCOLUMNS 新建表'[产品名称] , [产品名称] ) , "成本" , LOOKUPVALUE( '3.05 ADDCOLUMNS 新建表'[成本] , '3.05 ADDCOLUMNS 新建表'[产品名称] , [产品名称] ) )
LOOKUPVALUE 新建表 多条件匹配数据 = ADDCOLUMNS( SUMMARIZE( 'SA_销售记录' , 'SA_销售记录'[销售大区] , 'RS_日期表'[年度] ) ,"销售额" , LOOKUPVALUE( '3.04 SUMMARIZE 新建表'[销售额] , '3.04 SUMMARIZE 新建表'[销售大区] , [销售大区] , '3.04 SUMMARIZE 新建表'[年度] , [年度] ) )
对比 结果
RELATED/RELATEDTABLE
定义
RELATED:从其他表返回相关值;
RELATEDTABLE:返回已筛选的相关表,以使该表只包括相关行。
语法
RELATED( '维度表'[列 )
RELATEDTABLE( '事实表' )
逻辑
RELATED:是在多端表上访问一端表上记录,访问维度表的值,如果不存在满足条件的行,则返回空。
RELATEDTABLE:是在一端表上访问多端表,访问事实表的表,一般配合COUNTROWS做行计数。
对比
对比RELATED、RELATEDTABLE的使用结果
常用 公式
RELATED = SUMX('SA_销售记录' , RELATED( 'RS_定价表'[销售金额] ) * 'SA_销售记录'[订单数量] )
RELATETABLE = SUMX( 'RS_定价表' , COUNTROWS( RELATEDTABLE( 'SA_销售记录' ) ) * 'RS_定价表'[销售金额] )
对比 结果
TREATAS
定义
将输入表列视为其他表列。对每一列,筛选掉各自输出列中不存在的任何值。
语法
TREATAS( [表达式] , '表'[列] , '表'[列] , ...... )
逻辑
学习TREATAS需要先了解数据沿袭。但我们不深究数据沿袭的逻辑,我们以CALCULATE+FILTER+IN的公式解释运作逻辑。 TREATAS可以使用多参数进行数据沿袭。
对比
对比IN匹配查找对应选择时的内容,来理解TREATAS的作用。
常用 公式
TREATAS 无数据沿袭 = SUM( 'SA_销售记录'[销售金额] )/10000
TREATAS CALCULATE 等价公式= CALCULATE( SUM( 'SA_销售记录'[销售金额] ) / 10000 , FILTER( ALL( 'SA_销售记录'[产品名称] ) , [产品名称] IN VALUES( '3.8 TREATAS 产品名称 新建表'[产品名称] ) ) )
TREATAS TREATAS数据沿袭 = CALCULATE( SUM( 'SA_销售记录'[销售金额] ) / 10000 , TREATAS( VALUES( '3.8 TREATAS 产品名称 新建表'[产品名称] ) , 'SA_销售记录'[产品名称] ) )
TREATAS TREATAS数据沿袭多参数 = CALCULATE( SUM( 'SA_销售记录'[销售金额] ) / 10000 , TREATAS( CROSSJOIN( VALUES( '3.8 TREATAS 产品名称 新建表'[产品名称] ) , VALUES( '3.8 TREATAS 销售大区 新建表'[销售大区] ) ) , 'SA_销售记录'[产品名称] , 'SA_销售记录'[销售大区] ) )
对比 结果
USERELATIONSHIP
定义
指定要在计算DAX中使用的现有关系。通过命名两个作为端点的列定义该关系为参数。
语法
以USERELATIONSHIP( '事实表'[虚线连接的列] , '维度表'[虚线连接的列] )
逻辑
1. 现在关系建模中创建一对多的单项虚线关系,不启用关系。
2. 在DAX中输入虚线连接的两端字段,激活关系。
对比
以物理关系的结果与激活虚线关系的结果。
常用 公式
USERELATIONSHIP 虚线关系 = CALCULATE( [1.0 基础 度量值] , USERELATIONSHIP( 'SA_销售记录'[到货日期] , 'RS_日期表'[Date] ) )
对比 结果
CROSSJOIN
定义
返回是指定表的叉积的表。
语法
CROSSJOIN( '表1' , '表2' , '表3' , ...... )
逻辑
1. 确定需要加入笛卡尔积表的原表,表可以用所有表,也可以是筛选后的表表达式。
2. 在CROSSJOIN中输入所有表表达式。
对比
分别做三种不同情况的CROSSJOIN表
常用 公式
CROSSJOIN 产品名称+销售大区 = CROSSJOIN( '3.11 TREATAS 产品名称 新建表' , '3.11 TREATAS 销售大区 新建表' )
CROSSJOIN 产品名称+销售大区+年度 = CROSSJOIN( '3.11 TREATAS 产品名称 新建表' , '3.11 TREATAS 销售大区 新建表' , VALUES( 'RS_日期表'[年度] ) )
CROSSJOIN 产品名称+销售大区+2015/2016年度 = CROSSJOIN( '3.11 TREATAS 产品名称 新建表' , '3.11 TREATAS 销售大区 新建表' , FILTER( VALUES( 'RS_日期表'[年度] ) , [年度] = 2015 || [年度] = 2016 ) )
对比 结果
3
常用DAX公式
SELECTEDVALUE
定义
在指定列只有一个值时返回该值,否则返回替代结果。
语法
SELECTEDVALUE( '表'[列] , 替代值 )
逻辑
1. SELECTEDVALUE是IF+HASONEVALUE+VALUES的等价公式,更加简单。
2. SELECTEDVALUE拥有VALUES的筛选上下文的特性,可用A列做SELECTEDVALUE,去判断B列值的筛选上下文结果。
对比
以匿名表做SELECTEDVALUE的筛选度量值、以SELECTEDVALUE筛选上下文功能做单位换算
常用 公式
SELECTEDVALUE = SELECTEDVALUE( 'SA_销售记录'[产品名称] )
SELECTEDVALUE 动态筛选度量值 = VAR SHAIXUAN = SELECTEDVALUE( '3.3 SELECTEDVALUE 匿名表 筛选度量值'[业务指标] ) VAR DACHENG = CALCULATE( [1.0 基础 度量值] , 'RS_日期表'[年度] = 2016 ) VAR ZENGSU = DIVIDE( CALCULATE( [1.0 基础 度量值] , 'RS_日期表'[年度] = 2016 ) - CALCULATE( [1.0 基础 度量值] , 'RS_日期表'[年度] = 2015 ) , CALCULATE( [1.0 基础 度量值] , 'RS_日期表'[年度] = 2015 ) , 0 ) VAR ZHANBI = DIVIDE( CALCULATE( [1.0 基础 度量值] , 'RS_日期表'[年度] = 2016 ) , CALCULATE( [1.0 基础 度量值] , 'RS_日期表'[年度] = 2016 , ALL( 'SA_销售记录' ) ) , 0 ) RETURN SWITCH( TRUE(), SHAIXUAN = "年达成" , FORMAT( DACHENG , "0" ) , SHAIXUAN = "年同比" , FORMAT( ZENGSU , "0.0%" ) , SHAIXUAN = "年占比" , FORMAT( ZHANBI , "0.0%" ) , BLANK() )
SELECTEDVALUE 动态切换单位 = VAR X = [1.0 基础 度量值] * 10000 VAR Y = SELECTEDVALUE( '3.3 SELECTEDVALUE 单位换算表'[金额] ) RETURN DIVIDE( X , Y , 0 )
SELECTEDVALUE 第二个参数使用 = SELECTEDVALUE( 'SA_销售记录'[产品名称] , "总计行不计算" )
对比 结果
SUMMARIZE/SUMMARIZECOLUMNS
定义
SUMMARIZE:创建按指定列分组的输入表的摘要。
SUMMARIZECOLUMNS:创建针对组集请求的总计的摘要表格。
语法
SUMMARIZE( '表' , '表'[列] , '关系表'[列] , "新增列名" , [新增列的表达式] )
SUMMARIZECOLUMNS( '表'[列] , '关系表'[列] , "新增列名" , [新增列的表达式] )
逻辑
SUMMARIZE首先确定列取自的表,再加入表中对应的列,最后根据实际需求,可额外新增用DAX计算后的列。
SUMMARIZECOLUMNS是SUMMARIZE+ADDCOLUMNS等价公式,性能优于SUMMARIZE。
对比
对比SUMMARIZE、SUMMARIZE+ADDCOLUMNS、SUMMARIZECOLUMNS的新建表公式。
常用 公式
SUMMARIZE 新建表 = SUMMARIZE( 'SA_销售记录' , 'SA_销售记录'[销售大区] , 'RS_日期表'[年度] , "销售额" , SUM( 'SA_销售记录'[销售金额] ) / 10000 )
SUMMARIZE+ADDCOLUMNS 新建表 = ADDCOLUMNS( SUMMARIZE( 'SA_销售记录' , 'SA_销售记录'[销售大区] , 'RS_日期表'[年度]) , "销售额" , CALCULATE( SUM( 'SA_销售记录'[销售金额] ) / 10000 ) )
SUMMARIZECOLUMNS 新建表 = SUMMARIZECOLUMNS( 'SA_销售记录'[销售大区] , 'RS_日期表'[年度] , "销售额" , SUM( 'SA_销售记录'[销售金额] ) / 10000 )
SUMMARIZE/SUMMARIZECOLUMNS使用筛选上下文和行上下文做新增列的计算。 ADDCOLUMNS使用行上下文做新增列的计算。
对比 结果
ADDCOLUMNS
定义
返回具有DAX表达式指定的新列的表。
语法
ADDCOLUMNS( '表' , "列名" , [表达式] , .......)
逻辑
1. 向ADDCOLUMNS输入一个现有表格,可以是完整表,也可以是筛选行列后的表表达式。
2. 添加列名与对应表达式,注意ADDCOLUMNS中使用行上下文添加列。
对比
与DATATABLE/DATATABLE+TREATAS对比,初识数据沿袭概念。
常用 公式
ADDCOLUMNS 新建表 = ADDCOLUMNS( VALUES( 'SA_销售记录'[产品名称] ) , "销售额" , CALCULATE( SUM( 'SA_销售记录'[销售金额] ) ) )
ADDCOLUMNS+DATATABLE 新建表 = VAR BIAO = DATATABLE( "产品名称" , STRING , { { "棒球手套" } , { "球棒与球棒袋" } , { "头盔" } , { "棒球服" } , { "捕手护具" } , { "硬式棒球" } } ) RETURN ADDCOLUMNS( BIAO , "销售额" , CALCULATE( SUM( 'SA_销售记录'[销售金额] ) ) )
ADDCOLUMNS+DATATABLE+TREATAS 新建表 = VAR BIAO = DATATABLE( "产品名称" , STRING , { { "棒球手套" } , { "球棒与球棒袋" } , { "头盔" } , { "棒球服" } , { "捕手护具" } , { "硬式棒球" } } ) VAR YANXI = TREATAS( BIAO , 'SA_销售记录'[产品名称] ) RETURN ADDCOLUMNS( YANXI , "销售额" , CALCULATE( SUM( 'SA_销售记录'[销售金额] ) ) )
注意VALUES、DATATABLE、TREATAS的使用对数据带来不同的结果。 TREATAS会在后续会详细讲解。
对比 结果
CALENDAR/CALENDARAUTO
定义
CALENDAR:返回一个表,开始日期和结束日期之间的所有日期位于一列上;
CALENDARAUTO:返回一个表,其中有一列自动从模型计算日期。
语法
CALENDAR( [开始日期] , [结束日期] )
CALENDARAUTO( )
逻辑
CALENDAR是生成以开始日期和结束日期之前的一段连续日期的表,一般配合ADDCOLUMNS+DATE组件日期表。
CALENDARAUTO是在CALENDAR的基础上,自动识别模型中的最大最小日期。如果模型没有日期字段,则无法使用。
对比
对比两种日期表的制作。
常用 公式
CALENDAR = CALENDAR( DATE( 2022 , 1 , 1 ) , DATE( 2022 , 1 , 31 ) )
3.6 CALENDAR = ADDCOLUMNS(CALENDAR( DATE( 2022 , 1 , 1 ) , DATE( 2022 , 1 , 31 ) ), "年度" , YEAR( [Date] ) , "月度" , MONTH( [Date] ) , "日" , DAY( [Date] ) )
CALENDARAUTO = ADDCOLUMNS( CALENDARAUTO( ) , "年度" , YEAR( [Date] ) , "月度" , MONTH( [Date] ) , "日" , DAY( [Date] ) )
对比 结果
UNION
定义
返回其列相匹配的表的联合。
语法
UNION( '表1' , '表2' , '表3' , .......)
逻辑
1. 准备相应表格,必须保证表格的列数相同,否则无法合并。
2. 表可以是表表达式筛选后的内容,筛选后的内容必须保证顺序一致。
对比
全表的联合,配合SUMMARIZE+ADDCOLUMNS做表筛选和新增列的联合
常用 公式
UNION 全表合并 类增量刷新 新建表 = UNION( '更新清单' , '历史清单' )
UNION 筛选表与新增列 增量刷新+DAX完成基础数据清洗 新建表 = VAR LISHI = ADDCOLUMNS( SUMMARIZE( '历史清单' , '历史清单'[产品名称] , '历史清单'[销售大区] , '历史清单'[销售金额] , '历史清单'[产品成本] ) , "销售额" , CALCULATE( SUM( '历史清单'[销售金额] ) ) , "成本" , CALCULATE( SUM( '历史清单'[产品成本] ) ) , "成本率" , '历史清单'[产品成本] / '历史清单'[销售金额] ) VAR GENGXIN = ADDCOLUMNS( SUMMARIZE( '更新清单' , '更新清单'[产品名称] , '更新清单'[销售大区] , '更新清单'[销售金额] , '更新清单'[产品成本] ) , "销售额" , CALCULATE( SUM( '更新清单'[销售金额] ) ) , "成本" , CALCULATE( SUM( '更新清单'[产品成本] ) ) , "成本率" , '更新清单'[产品成本] / '更新清单'[销售金额] ) RETURN UNION( GENGXIN , LISHI )
注意 事项
1. UNION可完成类增量刷新的功能,原理在于DAX新建表是在需要调用表时进行代码刷新,即只要物理表刷新进去后,代码会根据DAX调用情况实时刷新。
2. 各类表达式都可以在新增列的表达式中使用,例如LEFT、RIGHT、MID、MOD、ROUND等,可直接使用,可极大的减少PQ中的数据清洗工作量,加快工作效率。
对比 结果
3
常用DAX公式
VALUES
定义
提供列名后,返回唯一项的单个列的表;提供表名后,返回具有相同列的表。
语法
VALUES( '表'[列] );VALUES( '表' )
逻辑
1. 当提供列为参数时,返回列的不重复值组成的表;当提供表为参数时,返回与原表相同的列,且不删除重复的行。
2. VALUES与ALL组合可以等价于ALLEXCEPT;
3. VALUES与COUNTROWS组合可以等价于HASONEVALUE;
4. 再加IF后可以等价于SELECTEDVALUE。
对比
与ALLEXCEPT对比、与HASONEVALUE对比、与SELECTEDVALUE对比。
常用 公式
VALUES 对比ALLEXCEPT = CALCULATE( [1.0 基础 度量值] , ALL( 'SA_销售记录' ) , VALUES( 'SA_销售记录'[产品名称] ) )
VALUES ALLEXCEPT = CALCULATE( [1.0 基础 度量值] , ALLEXCEPT( 'SA_销售记录' , 'SA_销售记录'[产品名称] ) )
VALUES 对比HASONEVALUE = IF( COUNTROWS( VALUES( 'SA_销售记录'[产品名称] ) ) = 1 , [1.0 基础 度量值] , BLANK() )
VALUES HASONEVALUE = IF( HASONEVALUE( 'SA_销售记录'[产品名称] ) , [1.0 基础 度量值] , BLANK() )
VALUES 对比SELECTEDVALUE = IF( COUNTROWS( VALUES( 'SA_销售记录'[产品名称] ) ) = 1 , VALUES( 'SA_销售记录'[产品名称] ) )
VALUES SELECTEDVALUE = SELECTEDVALUE( 'SA_销售记录'[产品名称] )
对比 结果
HASONEVALUE
定义
在指定列中仅有一个值时,返回TRUE。
语法
HASONEVALUE( '表'[列] )
逻辑
1. HASONEVALUE是COUNTROWS+VALUES的等价公式,更加符合业务逻辑。
2. 可多个HASONEVALUE嵌套判断使用,用于识别矩阵当前行对应的字段内容。
对比
以单个HASONEVALUE和多个HASONEVALUE做对比使用。
常用 公式
HASONEVALUE = IF( HASONEVALUE( 'SA_销售记录'[产品名称] ) , [1.0 基础 度量值] , BLANK() )
HASONEVALUE 判断当前行排名 = SWITCH( TRUE(), HASONEVALUE( 'RS_日期表'[年度] ) , RANKX( ALL( 'RS_日期表'[年度] ) , [1.0 基础 度量值] ) , HASONEVALUE( 'SA_销售记录'[销售大区] ) , RANKX( ALL( 'SA_销售记录'[销售大区] ) , [1.0 基础 度量值] ) , HASONEVALUE( 'SA_销售记录'[产品名称] ) , RANKX( ALL( 'SA_销售记录'[产品名称] ) , [1.0 基础 度量值] ) , BLANK() )
HASONEVALUE 对比SELECTEDVALUE = IF( HASONEVALUE( 'SA_销售记录'[产品名称] ) , VALUES( 'SA_销售记录'[产品名称] ) )
HASONEVALUE SELECTEDVALUE = SELECTEDVALUE( 'SA_销售记录'[产品名称] )
对比 结果
2
核心DAX公式
ALL系列
定义
返回为表中的所有行或列中的所有值。ALL/ALLEXCEPT/ALLSELECTED分别取消不同列的外部筛选,详见逻辑讲解。
语法
ALL( '表' ) ; ALL( '表'[列] ) ; ALLEXCEPT( '表' , '事实表'[列] , '维度表'[列] , ......) ; ALLSELECTED( '表' )
逻辑
1. ALL加表是取消所有外部筛选;
2. ALL加列是取消指定列的外部筛选;
3. ALLEXCEPT是仅保留指定列的外部筛选,其他列全部取消外部筛选;
4. ALLSELECTED是仅保留切片器生效部分字段的筛选,其他列取消外部筛选。
对比
以ALL/ALLEXCEPT/ALLSELECTED五个公式对比区别
常用 公式
ALL系列 ALL加表 取消所有外部筛选 = CALCULATE( [基础 度量值] , ALL( 'SA_销售记录' ) )
ALL系列 ALL加表 在上文环境取消下文外部筛选 = CALCULATE( [CALCULATE FILTER] , ALL( 'SA_销售记录' ) )
ALL系列 ALL加列 仅取消对应列的外部筛选 = CALCULATE( [基础 度量值] , ALL( 'SA_销售记录'[产品名称] ) )
ALL系列 ALLEXCEPT 保留指定列的外部筛选 取消其他列的外部筛选 = CALCULATE( [基础 度量值] , ALLEXCEPT( 'SA_销售记录' , 'RS_日期表'[年度] , 'SA_销售记录'[销售大区] ) )
ALL系列 ALLSELECTED 仅对切片器中字段进行筛选 其他列取消筛选 = CALCULATE( [基础 度量值] , ALLSELECTED( 'SA_销售记录' ) )
使用 逻辑
1. 先确定指标的业务逻辑,是保留哪些字段的外部筛选,取消哪些字段外部筛选。
2. 根据保留与取消的字段数量,确定需要用到的DAX公式
3. 写好公式后,用矩阵加入对应外部筛选的字段进行验证,验证保留/取消的外部筛选是否按照业务逻辑进行筛选与取消筛选。
对比 结果
VAR
定义
变量函数
语法
以VAR MS1 = [基础 度量值1] VAR MS2 = [基础 度量值2] RETURN MS1 + MS2
逻辑
1. 在每个VAR后进行变量的赋值,每一个VAR均为一个临时变量度量值。
2. 在RETURN后调用VAR进行最终度量值的计算
对比
以VAR的特性对比展示使用效果
常用 公式
VAR 变量即为定量 不可再做筛选 = VAR MS1 = [基础 度量值] VAR MS2 = CALCULATE( MS1 , 'SA_销售记录'[产品名称] = "棒球手套" ) RETURN MS2
VAR 赋值后不调用 = VAR MS1 = [基础 度量值] VAR MS2 = CALCULATE( [基础 度量值] , 'SA_销售记录'[产品名称] = "棒球手套" ) RETURN MS2
VAR 惰性计算原则 可重复调用 且仅计算一次 = VAR MS1 = SELECTEDVALUE( 'SA_销售记录'[产品名称] ) VAR MS2 = CALCULATE( [基础 度量值] , FILTER( 'SA_销售记录' , [产品名称] = "棒球手套" ) ) VAR MS3 = CALCULATE( [基础 度量值] , FILTER( 'SA_销售记录' , [产品名称] = "头盔" ) ) RETURN SWITCH( TRUE(), MS1 = "棒球手套" , MS2 , MS1 = "头盔" , MS3 , BLANK() )
对比 结果
理解上下文
计值 上下文
分为筛选上下文与行上下文
筛选 上下文
1. 用DAX添加度量值,在各自对应的上下文中计算。尽管公式相同,但结果不同,因为相同的代码作用于不同的数据子集。
2. 筛选上下文分为透视表的行列标签、切片器、筛选器以及其他视觉对象的交互筛选。
行 上下文
计算列是逐行计算的,行上下文就是指示DAX当前迭代计算的行。
上下文 转换
CALCULATE 执行上下文转换,将所有行上下文合并到一个新的等效筛选上下文中。
常用公式
上下文 筛选上下文 = SUM( 'SA_销售记录'[销售金额] ) / 10000
上下文 CALCULATE筛选上下文 = CALCULATE( [基础 度量值] , 'SA_销售记录'[产品名称] = "棒球手套" )
上下文 FITER创建行上下文 = CALCULATE( [基础 度量值] , FILTER( 'SA_销售记录' , [产品名称] = "棒球手套"))
上下文 SUM = SUM( '2.7 上下文 新建表'[销售额] )
上下文 上下文转换 = CALCULATE( SUM( '2.7 上下文 新建表'[销售额] ) )
上下文 按大小累计计算 EARLIER = SUMX( FILTER( '2.7 上下文 新建表' , '2.7 上下文 新建表'[销售额] >= EARLIER( '2.7 上下文 新建表'[销售额] ) ) , '2.7 上下文 新建表'[销售额] )
上下文 按大小累计 占比 = [上下文 按大小累计计算 EARLIER] / [上下文 SUM]
对比 结果
2
核心DAX公式
CALCULATE
定义
在筛选器修改的上下文中对表表达式进行求值。
语法
CALCULATE( 表达式 , [筛选器1] , [筛选器2] , … )
逻辑
1. 先做第二个参数及以后的表表达式的筛选,可以零条件/单条件/多条件,或与其它公式嵌套使用。
2. 再做第一个参数的聚合表达式的计值。
对比
CALCULATE的零条件筛选、语法糖、完整写法格式以及与其他公式组合运用
常用 公式
CALCULATE 零条件筛选 = CALCULATE( [基础 度量值] )
CALCULATE 单条件筛选 语法糖 = CALCULATE( [基础 度量值] , 'SA_销售记录'[产品名称] = "棒球手套" )
CALCULATE 多条件筛选 = CALCULATE( [基础 度量值] , 'SA_销售记录'[产品名称] = "棒球服" , 'SA_销售记录'[销售大区] = "雅安" )
CALCULATE 完整写法 = CALCULATE( [基础 度量值] , FILTER( ALL( 'SA_销售记录'[产品名称] ) , 'SA_销售记录'[产品名称] = "棒球手套" ) )
CALCULATE KEEPFILTERS = CALCULATE( [基础 度量值] , KEEPFILTERS( 'SA_销售记录'[产品名称] = "棒球手套" || 'SA_销售记录'[产品名称] = "棒球服") )
CALCULATE ALL = CALCULATE( [基础 度量值] , ALL( 'SA_销售记录' ) )
对比 结果
FILTER
定义
返回已筛选的表。
语法
FILTER( '表' , 筛选的条件 )
逻辑
1. 根据第一个参数确定筛选的表范围,这里的表可以嵌套其他表函数进行筛选,比如ALL系列公式。
2. 根据第二个参数的筛选条件去做迭代判断,每一行做一次迭代,迭代次数会影响效率。
对比
FILTER的各种写法,包含单条件、多条件AND/OR、包含判断、多条件嵌套以及新建表的筛选
常用 公式
FILTER 单条件 = CALCULATE( [基础 度量值] , FILTER( 'SA_销售记录' , [产品名称] = "棒球手套" ) )
FILTER 多条件 OR = CALCULATE( [基础 度量值] , FILTER( 'SA_销售记录' , [产品名称] = "棒球手套" || [产品名称] = "棒球服" ) )
FILTER 多条件 AND = CALCULATE( [基础 度量值] , FILTER( 'SA_销售记录' , [产品名称] = "棒球手套" && [销售大区] = "雅安" ) )
FILTER 多条件 IN = CALCULATE( [基础 度量值] , FILTER( 'SA_销售记录' , [产品名称] IN { "棒球手套" , "棒球服" } ) )
FILTER 包含 SEARCH = CALCULATE( [基础 度量值] , FILTER( 'SA_销售记录' , SEARCH( "*棒球*" , [产品名称] , , 0 ) ) )
FILTER 多条件嵌套 = CALCULATE( CALCULATE( [基础 度量值] , FILTER( 'SA_销售记录' , [产品名称] = "棒球手套" ) ) , FILTER( 'RS_日期表' , [年度] = 2016 ) )
FILTER 新建表 = CALCULATETABLE( VALUES( 'SA_销售记录' ) , FILTER( 'SA_销售记录' , [订单日期] = DATE( 2016 , 1 , 1 ) && [销售大区] = "雅安" ) )
对比 结果
X系列函数
定义
返回为表中的每一行计算的表达式的求和/平均值/最大值/最小值/计数。
语法
以SUMX为例,SUMX( '表' , 表达式 )
逻辑
1. 根据第一个参数确定筛选的表范围,这里的表可以嵌套其他表函数进行筛选,比如FILTER、ALL系列公式。
2. 根据第二个参数表达式进行逐行迭代计算,迭代完成后再求和/平均值/最大值/最小值/计数。
对比
以SUMX/MAXX/AVERAGEX的四个不同公式进行对比
常用 公式
SUMX 棒球手套销售额 简单迭代 = SUMX( FILTER( 'SA_销售记录' , [产品名称] = "棒球手套" ) , 'SA_销售记录'[销售金额] / 10000 )
SUMX 产品成本率 多列迭代计算再聚合 = SUMX( 'SA_销售记录' , 'SA_销售记录'[成本率] * 'SA_销售记录'[销售金额] ) / SUM( 'SA_销售记录'[销售金额] )
MAXX 与最大销售额的差距 = MAX( 'SA_销售记录'[销售金额] )- MAXX( ALL( 'SA_销售记录' ) , 'SA_销售记录'[销售金额] )
AVERAGEX 近七天平均销售额 = AVERAGEX( DATESINPERIOD( 'RS_日期表'[Date] , SELECTEDVALUE( 'RS_日期表'[Date] ), -6 , DAY ) , [基础 度量值] )
对比 结果
RANKX
定义
针对为指定表中每一行计算的表达式,返回值列表的当前上下文中计算的表达式的排名。
语法
RANKX( 表 , 表达式 , [值] , [Order] , [Ties] ) 以常用排名方法为例:RANKX( ALL( '表' [排序列] ) , [基础 度量值1] , [基础 度量值2] )
逻辑
1. 建立取消外部筛选的'表'[排序列]的表,并在这个虚拟表中进行[基础 度量值1]的计算。
2. 在外部筛选的情况做[基础 度量值2]的计值。
3. 将第二步做的外部筛选计值进行比对后,匹配相应位置。
对比
以RANKX的各类公式写作进行对比
常用 公式
RANKX 常规排名方法 = RANKX( ALL( 'SA_销售记录'[产品名称] ) , [基础 度量值] )
RANKX A度量值在B度量值中进行排名 = RANKX( ALL( 'SA_销售记录'[产品名称] ) , [基础 度量值] , [基础 度量值] * 3 )
RANKX 相对排名 = RANKX( ALLSELECTED( 'SA_销售记录'[产品名称] ) , [基础 度量值] )
RANKX 完整排名公式 升序 连续排名 = RANKX( ALL( 'SA_销售记录'[产品名称] ) , [基础 度量值] , [基础 度量值] , ASC , Dense )
RANKX 公式内基础度量值 = RANKX( ALL( 'SA_销售记录'[产品名称] ) , CALCULATE( SUM( 'SA_销售记录'[销售金额] ) ) )
RANKX 去除总计排名 = IF( HASONEVALUE( 'SA_销售记录'[产品名称] ) , [RANKX 常规排名方法] , BLANK() )
注意 事项
1. 第四个参数默认为降序,即DESC/0/FALSE,升序为ASC/1/TRUE
2. 第五个参数即相同排名同数,默认为SKIP下一个排名为跳跃+N,DENSE为+1排名。
3. 第三个参数、第四个参数、第五个参数均可忽略,若仅忽略部分参数,中间需要用 , 占位。
对比 结果
1
基础DAX公式
基础DAX
定义
对某列的值进行求和/计数/不重复计数/求平均值/求最大值/求最小值。
语法
以SUM为例,SUM( '表'[列] )
逻辑
唯一参数,直接输入对应表格的对应列即可完成,在度量值中会自带上下文CALCULATE隐藏公式。
对比
SUM/COUNT/DISTINCTCOUNT/AVERAGE/MAX/MIN具体公式,并带入产品名称,做上下文的外部筛选。
常用 公式
基础 销售额 SUM公式 = SUM( 'SA_销售记录'[销售金额] ) /10000
基础 交易数 COUNT = COUNT( 'SA_销售记录'[客户ID] )
基础 客户数 DISTINCTCOUNT = DISTINCTCOUNT( 'SA_销售记录'[客户ID] )
基础 平均销售额 AVERAGE = AVERAGE( 'SA_销售记录'[销售金额] )
基础 最大销售额 MAX = MAX( 'SA_销售记录'[[销售金额] )
基础 最小销售额 MIN = MIN( 'SA_销售记录'[销售金额] )
对比 结果
结尾
PowerBI简约派全产品介绍
7天入门 训练营
预计5月上线首期训练营,内容包含入门PowerBI视频教程、已上线LV1-LV8的纸质版一图文档、7天免费PowerBI AI助手、一份免费可视化模板。
知识圈
全免费鹅圈子,所有用户均可加入知识圈,在知识圈内获取免费的PowerBI模板与素材。
PowerBIAI助手
加入会员可获取PowerBI AI助手长期使用权限
LV1 数据清洗
现已完成更新,核心内容为Power Query数据清洗技巧。
LV2 数据建模
现已完成更新,核心内容为关系建模、DAX公式讲解。
LV3 数据 可视化
现已完成更新,核心内容为可视化基础/高级/进阶操作以及一套可视化模板
均已上线小鹅通
LV4 可视化 模板
预计5月上线,全年更新10套可视化模板
LV5 数据分析 专项案例
预计7月上线,重点讲解业务数据分析逻辑以及如何用PowerBI实现
LV6 Excel BI
预计8月上线,内容为Excel配合PowerBI快速完成双模型的高效技巧。
LV7 企业经营模型
预计年底上线,内容为讲解企业经营全景图以及背后的价值。
LV8 PowerBI Pro
预计24年上半年上线,将联合企业部署专家完成课程录制。
前言
数据建模的核心功能
关系建模
1. 整合数据源:可以在PowerBI内整合不同数据源的表集中在同一个模型进行运算,完成多维数据的分析与探索。
2. 优化数据查询:解决大宽表数据查询效率低的问题,通过关系建模的方式,减少冗余数据存储和数据加载量,缩短数据查询时间,快速响应用户数据请求,加快报告生成速度。
3. 数据建模可视化:PowerBI中可以使用关系建模可视化,快速理解每个表之间的关系与作用,更易于用户理解业务。
DAX公式
1. 更低学习成本:初入门DAX时,快借助对Excel公式的运用,快速上手理解初级DAX的制作方式,从而快速上手。
2. 低代码创建字段:通过DAX公式创建度量值、新建表以及新建列,在不同上下文环境中,以类似Excel公式的结构完成数据查询与运算。
3. 更贴近业务的数据分析:通过DAX七步制作法,可逐步从业务需求逐步完成DAX公式,完成DAX公式的同时,也完成业务经营逻辑的诠释
计值上下文
1. 筛选上下文:
(1) 实现动态过滤:通过筛选上下文,用户可根据需求来动态更改过滤器,以便更好地控制数据的显示范围。
(2) 交互式分析:用户可通过可视化添加切片器更改数据显示范围,更快更好更灵活的控制数据呈现范围。
(3) 提高数据质量:通过筛选器,用户在控制数据的同时,减少数据的冗余和复杂性,提高数据的可靠性和准确性。
2. 行上下文:
(1) 计算每一行的值:可类似Excel的形式,完成每一行值的计算,也可根据需求迭代判断每一行值后再做计算。
(2) 简化数据计算:相比筛选上下文,行上下文计算更加简单易懂,简化数据计算的复杂性。
(3) 基于关系快速VLOOKUP:通过关系建模+RELATED公式,快速完成数据的匹配,运行效率高于PQ的合并查询。