PowerBI DAX 在矩阵分组区域内通用积累求和
什么是在矩阵分组区域内积累求和,先看一个例子吧。
对于左右两个图表,它们的规律是:
- 左图:在分组区域内,按照与当前元素的KPI从小到大,积累求和;
- 右图:在分组区域内,按照与当前元素的名称从小到大,积累求和。
这两种模式都非常常见,很多计算都会涉及这个问题。
这里给出了两种实现,一种是模型层计算;一种是视图层计算。
分别进行详解。我们先给出计算公式,再对重要技巧做出总结。
按KPI积累,模型层计算
DAX 公式如下:
KPI.组内积累.按KPI大小.模型法 =
VAR _value = [KPI]
VAR _items =
FILTER(
CALCULATETABLE( SUMMARIZE( Customer , Customer[Industry] , Customer[Occupation] ) , ALL( Customer[Occupation] ) ),
[KPI] <= _value
)
RETURN CALCULATE( [KPI] , _items )
按KPI积累,视图层计算
DAX 公式如下:
KPI.组内积累.按KPI大小.视图法 =
VAR _value_current = [KPI]
VAR _view =
CALCULATETABLE(
ADDCOLUMNS(
SUMMARIZE( Customer , Customer[Industry] , Customer[Occupation] ),
"@KPI",
[KPI]
),
ALLSELECTED( )
)
VAR _group = VALUES( Customer[Industry] )
RETURN
SUMX( _group ,
SUMX( _view , IF( [Industry] = EARLIER( Customer[Industry] ) && [@KPI] <= _value_current , [@KPI] ) )
)
按名称积累,模型层计算
DAX 公式如下:
KPI.组内积累.按元素名称.模型法 =
VAR _value = [KPI]
VAR _item = SELECTEDVALUE( Customer[Occupation] , "座座座座" )
VAR _items =
FILTER(
CALCULATETABLE( SUMMARIZE( Customer , Customer[Industry] , Customer[Occupation] ) , ALL( Customer[Occupation] ) ),
ISONORAFTER( [Occupation] , _item , DESC )
)
RETURN CALCULATE( [KPI] , _items )
按名称积累,视图层计算
DAX 公式如下:
KPI.组内积累.按元素名称.视图法 =
VAR _value_current = SELECTEDVALUE( Customer[Occupation] , "座座座座" )
VAR _view =
CALCULATETABLE(
ADDCOLUMNS(
SUMMARIZE( Customer , Customer[Industry] , Customer[Occupation] ),
"@KPI",
[KPI]
),
ALLSELECTED( )
)
VAR _group = VALUES( Customer[Industry] )
RETURN
SUMX( _group ,
SUMX( _view , IF( [Industry] = EARLIER( Customer[Industry] ) && [Occupation] <= _value_current , [@KPI] ) )
)
总结
我们在此前多次提到视图层计算,其通用思维模式其实已经给出,真正的正式给出也呼之欲出,我们会单独发文。
反思
首先,这个问题,让我们对 DAX 计算再次反思:
DAX 计算从本质来讲,永远发生在模型层。
但若对于某计算,其计算若只需依赖已经计算完毕的内容,我们称:
1、已经计算完毕的内容为视图;
2、基于视图再进行的二次计算为视图层计算。
请大家仔细观察上述两种模式的实际 DAX 公式,便可以发现视图层计算往往具有两大重大优势:
1、已经计算完毕的内容由于往往可以得到缓存而使得后续计算更快;
2、已经计算完毕的内容不会再收到筛选上下文等复杂逻辑影响,更容易编写后续计算逻辑。
这便是对 DAX 计算的反思。
微软 PowerBI 产品组正在面临一个非常尴尬的抉择问题:
1、若 PowerBI 提供原生的视图层计算功能,如:一个新的函数集合,但不属于 DAX,那么,这将使得 PowerBI 除了有 Power Query 的 M,以及数据建模 DAX,又将出现一个视图计算的新函数库,导致 PowerBI 会变得更加难以理解,这是不希望发生的。
2、若 PowerBI 将视图层计算功能融入到 DAX 中,将导致作为纯模型层计算的函数库 DAX 掺杂了其他内容而使得 DAX 不再纯粹,这也是不希望发生的。
因此,在微软 PowerBI 产品组决定使用任何方法之前,都会意识到不管怎么决定,对 PowerBI 都将引入新的复杂性。
本案例技巧
本案例在计算按名称累计时,使用了一个非常有创意的技巧:SELECTEDVALUE( Customer[Occupation] , "座座座座" )
默认返回"座座座座",将作为中英文世界的词语几乎是最大字符而使得在小计行或总计行可以完成正确的计算。
- 快速搭建主从的脚本和问题排查
- MySQL在RR隔离级别下的unique失效和死锁模拟
- Golang语言--glog日志库使用
- 一个MySQL死锁问题的复现
- Spring Boot 2.0 新特性(一):配置绑定 2.0 全解析
- MySQL断电恢复的一点简单分析
- Spring Boot 2.0 新特性(二):新增事件ApplicationStartedEvent
- 奇怪的go语言iota
- Golang web服务器处理前端HTTP请求跨域的方法
- MySQL死锁的两个小案例
- Go 的浏览器集成测试
- 关于数据库Prepare返回指针的的问题
- 怎么设置 http 请求 并发 连接数 限制
- MySQL 5.7中锁的一个通用问题
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Swift 元祖
- Flutter - 解决混合开发iOS脚本打包遇到的问题
- Shader 特效 —— Film Burn (炫光光晕)效果【GLSL】
- java selenium chromedriver浏览器驱动放在哪里?【两种位置】
- 56. Vue原生js的组件拆分结构设计
- 一步一步教你把 Redux Saga 添加到 React&Redux 程序中
- Octave的基本语句及函数的使用入门—ML Note 31
- JAVA的Lock锁接口实现
- 抽象语法树为什么抽象
- burpsuite IP伪造插件
- 用阻塞队列,再系一次鞋带
- I2C总线架构 之 设备驱动
- kail 安装及卸载 docker【亲测可用】
- mac 登录远程服务器(常规ssh+免密快捷方式)
- git常用操作--分支同步master 本地库提交到远程分支