什么是在矩阵分组区域内积累求和,先看一个例子吧。
web
对于左右两个图表,它们的规律是:缓存
左图:在分组区域内,按照与当前元素的KPI从小到大,积累求和;微信
右图:在分组区域内,按照与当前元素的名称从小到大,积累求和。app
这两种模式都很是常见,不少计算都会涉及这个问题。函数
这里给出了两种实现,一种是模型层计算;一种是视图层计算。学习
分别进行详解。咱们先给出计算公式,再对重要技巧作出总结。spa
按KPI积累,模型层计算
DAX 公式以下:.net
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 公式以下:3d
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 公式以下:code
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 计算从本质来说,永远发生在模型层。
但若对于某计算,其计算若只需依赖已经计算完毕的内容,咱们称:
一、已经计算完毕的内容为视图;
二、基于视图再进行的二次计算为视图层计算。
请你们仔细观察上述两种模式的实际 DAX 公式,即可以发现视图层计算每每具备两大重大优点:
一、已经计算完毕的内容因为每每能够获得缓存而使得后续计算更快;
二、已经计算完毕的内容不会再收到筛选上下文等复杂逻辑影响,更容易编写后续计算逻辑。
这即是对 DAX 计算的反思。
微软 PowerBI 产品组正在面临一个很是尴尬的抉择问题:
一、若 PowerBI 提供原生的视图层计算功能,如:一个新的函数集合,但不属于 DAX,那么,这将使得 PowerBI 除了有 Power Query 的 M,以及数据建模 DAX,又将出现一个视图计算的新函数库,致使 PowerBI 会变得更加难以理解,这是不但愿发生的。
二、若 PowerBI 将视图层计算功能融入到 DAX 中,将致使做为纯模型层计算的函数库 DAX 掺杂了其余内容而使得 DAX 再也不纯粹,这也是不但愿发生的。
所以,在微软 PowerBI 产品组决定使用任何方法以前,都会意识到无论怎么决定,对 PowerBI 都将引入新的复杂性。
本案例技巧
本案例在计算按名称累计时,使用了一个很是有创意的技巧:SELECTEDVALUE( Customer[Occupation] , "座座座座" )
默认返回"座座座座",将做为中英文世界的词语几乎是最大字符而使得在小计行或总计行能够完成正确的计算。
让数据真正成为你的力量
Create value through simple and easy with fun by PowerBI
Excel BI | DAX Pro | DAX 权威指南 | 线下VIP学习
扫码与PBI精英一块儿学习,验证码:data2020
PowerBI MVP 带你学习 PowerBI
点击“阅读原文”,即刻开始
↙
本文分享自微信公众号 - PowerBI战友联盟(powerbichina)。
若有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一块儿分享。