PowerBI 根据条件选择获得不同的表格 因为IF和SWITCH只能返回标量而不能返回表格 Power BI

PowerBI 根据条件选择返回不同的表格 因为IF和SWITCH只能返回标量而不能返回表格 Power BI
自定义日期筛选套件

根据条件得到不同的表格

背景

在设置自定义对比日期时,需要根据选择的内容返回不同的表格作为CALCULATE的表格参数进行计算。Power BI-自定义范围

图1:Power BI-自定义范围的日期套件组件

在Power BI 设置了如上的对比日期组件套件。以上的日期组件中,在点击了自定义范围,并输入跨越天数,左边的会根据选择的开始时间和结束时间进行对比期和基准期的设置。

如上图所示,截图选择了开始时间和结束时间分别为:2023/11/12~2024/3/12时,会根据右边的对比方式进行对比期的调整。这次选择的是自定义范围,跨越天数30天,则
对比期为:2023/11/12~2023/12/12
基准期为:2024/03/12~2024/04/11
度量的对比值和基准值需要按照以上对应日期进行计算。结果如下图所示。

Power BI-自定义范围的度量

图2:Power BI-自定义范围的度量

为了实现该功能,需要先检测图1的套件组件的选择,并根据选择返回对应的日期表格作为度量计算的条件。

代码实现

1、IFSWITCH的伪实现

注:以下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])
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值