PowerBI 根据条件选择获得不同的表格 因为IF和SWITCH只能返回标量而不能返回表格 Power BI
PowerBI 根据条件选择返回不同的表格 因为IF和SWITCH只能返回标量而不能返回表格 Power BI
自定义日期筛选套件
根据条件得到不同的表格
背景
在设置自定义对比日期时,需要根据选择的内容返回不同的表格作为CALCULATE的表格参数进行计算。
在Power BI 设置了如上的对比日期组件套件。以上的日期组件中,在点击了自定义范围,并输入跨越天数,左边的会根据选择的开始时间和结束时间进行对比期和基准期的设置。
如上图所示,截图选择了开始时间和结束时间分别为:2023/11/12~2024/3/12时,会根据右边的对比方式进行对比期的调整。这次选择的是自定义范围,跨越天数30天,则
对比期为:2023/11/12~2023/12/12。
基准期为:2024/03/12~2024/04/11。
度量的对比值和基准值需要按照以上对应日期进行计算。结果如下图所示。
为了实现该功能,需要先检测图1的套件组件的选择,并根据选择返回对应的日期表格作为度量计算的条件。
代码实现
1、IF和SWITCH的伪实现
注:以下1.1和1.2两段代码均会报错,因为IF和SWITCH只允许返回标量而不允许返回表格。
1.1 IF
IF(UnitSec = "日", FILTER(ALL('日期表'), '日期表'[DateKey] = BaseDate),
IF(UnitSec = "年", FILTER(ALL('日期表'), '日期表'[Year] = BaseYear),
IF(UnitSec = "季", FILTER(ALL('日期表'), '日期表'[Year] = BaseYear && '日期表'[Quarter] = BaseQuarter),
IF(UnitSec = "月", FILTER(ALL('日期表'), '日期表'[Year] = BaseYear && '日期表'[Month] = BaseMonth),
IF(UnitSec = "周", FILTER(ALL('日期表'), '日期表'[Year] = BaseYear && '日期表'[Week] = BaseWeek), BLANK())
)
)
)
)
1.2 SWITCH
SWITCH (
TRUE (),
UnitSec = "日", FILTER (ALL('日期表'), '日期表'[DateKey] = BaseDate ),
UnitSec = "年", FILTER (ALL('日期表'), '日期表'[Year] = BaseYear ),
UnitSec = "季", FILTER (ALL('日期表'), '日期表'[Year] = BaseYear && '日期表'[Quarter] = BaseQuarter ),
UnitSec = "月", FILTER (ALL('日期表'), '日期表'[Year] = BaseYear && '日期表'[Month] = BaseMonth ),
UnitSec = "周", FILTER (ALL('日期表'), '日期表'[Year] = BaseYear && '日期表'[Week] = BaseWeek )
)
2.真实实现 UNION+ADDCOLUMNS
基本思路:通过对各自的日期表格进行标记拼接,而后返回过滤值进行筛选拼接的表格即可
VAR UnionTable =
UNION(
ADDCOLUMNS(
SELECTCOLUMNS(FILTER(ALL('日期表'), '日期表'[Year] = BaseYear),"DateKey",[DateKey])
, "FILTERNUM", "年"
)
, ADDCOLUMNS(
SELECTCOLUMNS(FILTER(ALL('日期表'), '日期表'[Year] = BaseYear && '日期表'[Quarter] = BaseQuarter),"DateKey",[DateKey])
, "FILTERNUM", "季"
)
, ADDCOLUMNS(
SELECTCOLUMNS(FILTER(ALL('日期表'), '日期表'[Year] = BaseYear && '日期表'[Month] = BaseMonth),"DateKey",[DateKey])
, "FILTERNUM", "月"
)
, ADDCOLUMNS(
SELECTCOLUMNS(FILTER(ALL('日期表'), '日期表'[Year] = BaseYear && '日期表'[Week] = BaseWeek),"DateKey",[DateKey])
, "FILTERNUM", "周"
)
, ADDCOLUMNS(
SELECTCOLUMNS(FILTER(ALL('日期表'),'日期表'[DateKey] = BaseDate),"DateKey",[DateKey])
, "FILTERNUM", "日"
)
)
RETURN
SELECTCOLUMNS(FILTER(UnionTable,[FILTERNUM]=UnitSec),"DateKey",[DateKey])