使用DAX的COUNTROWS与ALL函数保留行表头的解决方案
DAX实现切片器筛选时保留全量月份行并显示对应计数
问题分析
你当前的DAX代码逻辑存在矛盾:ALL(dCalendar)会清除日历表的所有筛选上下文(包括行表头的月份上下文),随后VALUES(dCalendar[Month])仅引入切片器选中的月份,导致所有行都返回切片器选中月份的计数,这就是筛选后得到表格2的根本原因。
修正方案
要实现「切片器筛选时,仍显示所有月份的行,且每个行对应自身月份的流失记录数」的需求,需要保留行上下文的月份,同时移除切片器对日历表的筛选。以下是两种等价的DAX实现:
方案1:使用REMOVEFILTERS
Countrows = CALCULATE( COUNTROWS(fChurnReason), REMOVEFILTERS(dCalendar), -- 移除切片器对日历表的筛选 KEEPFILTERS(VALUES(dCalendar[Month])) -- 保留行上下文的当前月份 )
方案2:使用ALL替代REMOVEFILTERS
Countrows = CALCULATE( COUNTROWS(fChurnReason), ALL(dCalendar), KEEPFILTERS(VALUES(dCalendar[Month])) )
逻辑说明
REMOVEFILTERS(dCalendar)/ALL(dCalendar):清除切片器带来的日历表筛选,确保计算不受切片器选中月份的限制KEEPFILTERS(VALUES(dCalendar[Month])):强制保留行表头的当前月份上下文,让CALCULATE仅计算该月份对应的流失记录数
这样无论切片器选中哪个月份,表格都会显示所有月份的行,且每个行的数值是该月份本身的流失计数,符合表格1的期望结果。
内容的提问来源于stack exchange,提问作者Greg
相关产品推荐
相关产品推荐

