自学内容网 自学内容网

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])

原文地址:https://blog.csdn.net/garbageSystem/article/details/143185214

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!